From 547854a151d752d2d05744ba2113223b6d25c059 Mon Sep 17 00:00:00 2001 From: Ilya Kantor Date: Wed, 18 Nov 2015 16:15:29 +0300 Subject: [PATCH] up --- 1-js/1-getting-started/1-intro/article.md | 81 +- 1-js/1-getting-started/3-editor/article.md | 32 +- 1-js/1-getting-started/4-devtools/article.md | 18 +- .../10-es-modern/1-es-modern-usage/article.md | 75 - 1-js/10-es-modern/10-set-map/article.md | 284 -- .../1-promise-settimeout/solution.md | 8 - .../11-promise/1-promise-settimeout/task.md | 27 - .../11-promise/2-promise-sequence/solution.md | 27 - .../solution.view/guest.json | 4 - .../solution.view/httpGet.js | 25 - .../solution.view/index.html | 34 - .../solution.view/user.json | 4 - .../2-promise-sequence/source.view/guest.json | 4 - .../2-promise-sequence/source.view/httpGet.js | 25 - .../2-promise-sequence/source.view/index.html | 20 - .../2-promise-sequence/source.view/user.json | 4 - .../11-promise/2-promise-sequence/task.md | 26 - 1-js/10-es-modern/11-promise/anon.png | Bin 30427 -> 0 bytes 1-js/10-es-modern/11-promise/article.md | 843 ------ 1-js/10-es-modern/11-promise/guest.json | 4 - 1-js/10-es-modern/11-promise/promiseEcma.png | Bin 14336 -> 0 bytes .../11-promise/promiseEcma@2x.png | Bin 37865 -> 0 bytes .../11-promise/promiseHandlerVariants.png | Bin 46708 -> 0 bytes .../11-promise/promiseHandlerVariants@2x.png | Bin 101250 -> 0 bytes 1-js/10-es-modern/11-promise/promiseInit.png | Bin 10702 -> 0 bytes .../11-promise/promiseInit@2x.png | Bin 22513 -> 0 bytes .../11-promise/promiseLoadAvatarChain-1.png | Bin 12879 -> 0 bytes .../promiseLoadAvatarChain-1@2x.png | Bin 28947 -> 0 bytes .../11-promise/promiseLoadAvatarChain-2.png | Bin 23610 -> 0 bytes .../promiseLoadAvatarChain-2@2x.png | Bin 52585 -> 0 bytes .../11-promise/promiseLoadAvatarChain-3.png | Bin 40613 -> 0 bytes .../promiseLoadAvatarChain-3@2x.png | Bin 90486 -> 0 bytes .../11-promise/promiseLoadAvatarChain-4.png | Bin 51842 -> 0 bytes .../promiseLoadAvatarChain-4@2x.png | Bin 115815 -> 0 bytes .../11-promise/promiseLoadAvatarChain.png | Bin 51151 -> 0 bytes .../11-promise/promiseLoadAvatarChain@2x.png | Bin 115409 -> 0 bytes 1-js/10-es-modern/11-promise/promiseTwo.png | Bin 17988 -> 0 bytes .../10-es-modern/11-promise/promiseTwo@2x.png | Bin 36357 -> 0 bytes .../11-promise/promiseTwoThen.png | Bin 29078 -> 0 bytes .../11-promise/promiseTwoThen@2x.png | Bin 62871 -> 0 bytes .../11-promise/promiseUserFlow.png | Bin 31756 -> 0 bytes .../11-promise/promiseUserFlow@2x.png | Bin 72003 -> 0 bytes 1-js/10-es-modern/11-promise/user.json | 4 - .../10-es-modern/11-promise/userNoGithub.json | 4 - 1-js/10-es-modern/12-generator/anon.png | Bin 30427 -> 0 bytes 1-js/10-es-modern/12-generator/article.md | 904 ------ .../10-es-modern/12-generator/genYield2-2.png | Bin 31534 -> 0 bytes .../12-generator/genYield2-2@2x.png | Bin 73441 -> 0 bytes .../10-es-modern/12-generator/genYield2-3.png | Bin 25158 -> 0 bytes .../12-generator/genYield2-3@2x.png | Bin 58403 -> 0 bytes 1-js/10-es-modern/12-generator/genYield2.png | Bin 21141 -> 0 bytes .../12-generator/genYield2@2x.png | Bin 47430 -> 0 bytes .../12-generator/generateSequence-1.png | Bin 9195 -> 0 bytes .../12-generator/generateSequence-1@2x.png | Bin 21884 -> 0 bytes .../12-generator/generateSequence-2.png | Bin 13714 -> 0 bytes .../12-generator/generateSequence-2@2x.png | Bin 30374 -> 0 bytes .../12-generator/generateSequence-3.png | Bin 13747 -> 0 bytes .../12-generator/generateSequence-3@2x.png | Bin 30376 -> 0 bytes .../12-generator/generateSequence-4.png | Bin 13777 -> 0 bytes .../12-generator/generateSequence-4@2x.png | Bin 29981 -> 0 bytes 1-js/10-es-modern/12-generator/user.json | 4 - 1-js/10-es-modern/2-let-const/article.md | 209 -- 1-js/10-es-modern/3-destructuring/article.md | 324 -- 1-js/10-es-modern/4-es-function/article.md | 469 --- 1-js/10-es-modern/5-es-string/article.md | 332 --- 1-js/10-es-modern/6-es-object/article.md | 368 --- 1-js/10-es-modern/7-es-class/article.md | 382 --- 1-js/10-es-modern/8-symbol/article.md | 210 -- 1-js/10-es-modern/9-iterator/article.md | 230 -- 1-js/10-es-modern/index.md | 4 - 1-js/2-first-steps/1-hello-world/article.md | 31 +- .../1-simple-page/solution.md | 0 .../1-simple-page/task.md | 0 .../{11-uibasic => 10-uibasic}/article.md | 37 +- .../6-rewrite-if-else-question/task.md | 2 +- 1-js/2-first-steps/12-ifelse/article.md | 25 +- .../13-logical-ops/4-alert-and/solution.md | 2 +- 1-js/2-first-steps/13-logical-ops/article.md | 79 +- .../1-loop-last-value/solution.md | 2 +- .../15-while-for/4-for-even/solution.md | 2 +- 1-js/2-first-steps/15-while-for/article.md | 97 +- .../2-first-steps/17-let-var-const/article.md | 2 + .../1-if-else-required/solution.md | 2 +- .../1-if-else-required/task.md | 15 +- .../solution.md | 9 +- .../2-rewrite-function-question-or/task.md | 19 +- .../18-function-basics/3-min/solution.md | 6 +- .../18-function-basics/3-min/task.md | 8 +- .../18-function-basics/4-pow/solution.md | 16 +- .../18-function-basics/4-pow/task.md | 8 +- .../18-function-basics/article.md | 82 +- .../article.md | 298 +- .../2-external-script/article.md | 170 +- .../2-first-steps/2-external-script/banner.js | 1 + 1-js/2-first-steps/3-structure/article.md | 66 +- 1-js/2-first-steps/4-strict-mode/article.md | 29 +- 1-js/2-first-steps/5-variables/article.md | 135 +- 1-js/2-first-steps/7-types/article.md | 101 +- .../8-operators/1-increment-order/solution.md | 31 +- .../8-operators/1-increment-order/task.md | 18 +- .../2-assignment-result/solution.md | 15 +- .../8-operators/2-assignment-result/task.md | 4 +- .../3-primitive-conversions-questions/task.md | 3 +- 1-js/2-first-steps/8-operators/article.md | 121 +- 1-js/2-first-steps/9-comparison/article.md | 114 +- 1-js/2-first-steps/index.md | 2 +- .../1-window-and-variable/solution.md | 24 - .../1-window-and-variable/task.md | 13 - .../2-window-and-variable-2/solution.md | 12 - .../2-window-and-variable-2/task.md | 13 - .../3-window-and-variable-3/solution.md | 14 - .../3-window-and-variable-3/task.md | 15 - .../1-global-object/article.md | 233 -- .../2-closures/1-say-phrase-first/solution.md | 16 - .../2-closures/1-say-phrase-first/task.md | 18 - .../2-which-value-is-modified/solution.md | 9 - .../2-which-value-is-modified/task.md | 25 - .../2-closures/3-var-window/solution.md | 29 - .../2-closures/3-var-window/task.md | 19 - .../2-closures/4-call-inplace/solution.md | 37 - .../2-closures/4-call-inplace/task.md | 17 - .../5-access-outer-variable/solution.md | 3 - .../5-access-outer-variable/task.md | 17 - .../6-counter-window-variable/solution.md | 30 - .../6-counter-window-variable/task.md | 29 - 1-js/5-functions-closures/2-closures/6@2x.png | Bin 23137 -> 0 bytes .../2-closures/article.md | 411 --- .../3-scope-new-function/article.md | 93 - .../1-closure-sum/solution.md | 18 - .../4-closures-usage/1-closure-sum/task.md | 13 - .../2-stringbuffer/_js.view/solution.js | 10 - .../2-stringbuffer/_js.view/test.js | 21 - .../2-stringbuffer/solution.md | 32 - .../4-closures-usage/2-stringbuffer/task.md | 45 - .../_js.view/solution.js | 16 - .../_js.view/test.js | 30 - .../3-stringbuffer-with-clear/solution.md | 34 - .../3-stringbuffer-with-clear/task.md | 24 - .../4-sort-by-field/solution.md | 37 - .../4-closures-usage/4-sort-by-field/task.md | 53 - .../_js.view/solution.js | 24 - .../_js.view/source.js | 11 - .../_js.view/test.js | 58 - .../5-filter-through-function/solution.md | 82 - .../5-filter-through-function/task.md | 29 - .../6-make-army/_js.view/solution.js | 19 - .../6-make-army/_js.view/source.js | 13 - .../6-make-army/_js.view/test.js | 20 - .../4-closures-usage/6-make-army/solution.md | 218 -- .../4-closures-usage/6-make-army/task.md | 31 - .../4-closures-usage/article.md | 125 - .../5-closures-module/article.md | 322 -- .../hello-conflict.view/hello.js | 10 - .../hello-conflict.view/index.html | 23 - .../hello-module.view/hello.js | 14 - .../hello-module.view/index.html | 23 - .../6-memory-management/article.md | 326 -- .../6-memory-management/family-no-family.png | Bin 19994 -> 0 bytes .../family-no-family@2x.png | Bin 46213 -> 0 bytes .../family-no-father-2.png | Bin 9862 -> 0 bytes .../family-no-father-2@2x.png | Bin 22643 -> 0 bytes .../6-memory-management/family-no-father.png | Bin 16369 -> 0 bytes .../family-no-father@2x.png | Bin 38251 -> 0 bytes .../6-memory-management/family.png | Bin 17331 -> 0 bytes .../6-memory-management/family@2x.png | Bin 39557 -> 0 bytes .../7-with/1-with-function/solution.md | 21 - .../7-with/1-with-function/task.md | 22 - .../7-with/2-with-variables/solution.md | 22 - .../7-with/2-with-variables/task.md | 19 - 1-js/5-functions-closures/7-with/article.md | 190 -- 1-js/5-functions-closures/index.md | 5 - .../1-call-array-this/solution.md | 15 - .../1-call-array-this/task.md | 16 - .../2-check-syntax/solution.md | 27 - .../1-object-methods/2-check-syntax/task.md | 16 - .../1-object-methods/3-why-this/solution.md | 32 - .../1-object-methods/3-why-this/task.md | 26 - .../4-object-property-this/solution.md | 22 - .../4-object-property-this/task.md | 18 - .../5-return-this/solution.md | 5 - .../1-object-methods/5-return-this/task.md | 21 - .../6-return-object-this/solution.md | 26 - .../6-return-object-this/task.md | 23 - .../7-calculator/_js.view/solution.js | 14 - .../7-calculator/_js.view/test.js | 22 - .../1-object-methods/7-calculator/solution.md | 24 - .../1-object-methods/7-calculator/task.md | 22 - .../8-chain-calls/solution.md | 23 - .../1-object-methods/8-chain-calls/task.md | 40 - .../1-object-methods/article.md | 244 -- .../1-array-equals-string/solution.md | 15 - .../1-array-equals-string/task.md | 11 - .../2-tostring-valueof/solution.md | 10 - .../2-tostring-valueof/task.md | 24 - .../3-compare-empty-arrays/solution.md | 34 - .../3-compare-empty-arrays/task.md | 13 - .../solution.md | 35 - .../task.md | 18 - .../5-sum-many-brackets/solution.md | 61 - .../5-sum-many-brackets/task.md | 17 - .../2-object-conversion/article.md | 281 -- .../1-two-functions-one-object/solution.md | 19 - .../1-two-functions-one-object/task.md | 18 - .../_js.view/solution.js | 15 - .../2-calculator-constructor/_js.view/test.js | 25 - .../2-calculator-constructor/solution.md | 27 - .../2-calculator-constructor/task.md | 22 - .../3-accumulator/_js.view/solution.js | 8 - .../3-accumulator/_js.view/test.js | 37 - .../3-accumulator/solution.md | 19 - .../3-constructor-new/3-accumulator/task.md | 24 - .../_js.view/solution.js | 29 - .../4-calculator-extendable/_js.view/test.js | 26 - .../4-calculator-extendable/solution.md | 55 - .../4-calculator-extendable/task.md | 47 - .../3-constructor-new/article.md | 216 -- .../1-replace-property-getter/solution.md | 48 - .../1-replace-property-getter/task.md | 32 - .../4-descriptors-getters-setters/article.md | 403 --- .../1-objects-counter/_js.view/solution.js | 11 - .../1-objects-counter/_js.view/test.js | 28 - .../1-objects-counter/solution.md | 29 - .../1-objects-counter/task.md | 33 - .../article.md | 255 -- .../1-rewrite-sum-arguments/solution.md | 31 - .../1-rewrite-sum-arguments/task.md | 30 - .../_js.view/solution.js | 3 - .../_js.view/test.js | 15 - .../solution.md | 28 - .../task.md | 40 - 1-js/6-objects-more/6-call-apply/article.md | 311 -- .../7-bind/1-cross-browser-bind/solution.md | 8 - .../7-bind/1-cross-browser-bind/task.md | 23 - .../2-write-to-object-after-bind/solution.md | 22 - .../2-write-to-object-after-bind/task.md | 18 - .../7-bind/3-second-bind/solution.md | 58 - .../7-bind/3-second-bind/task.md | 17 - .../solution.md | 4 - .../4-function-property-after-bind/task.md | 22 - .../7-bind/5-question-use-bind/solution.md | 110 - .../7-bind/5-question-use-bind/task.md | 50 - .../7-bind/6-ask-currying/solution.md | 73 - .../7-bind/6-ask-currying/task.md | 57 - 1-js/6-objects-more/7-bind/article.md | 434 --- .../1-logging-decorator/_js.view/solution.js | 9 - .../1-logging-decorator/_js.view/test.js | 50 - .../1-logging-decorator/solution.md | 44 - .../8-decorators/1-logging-decorator/task.md | 32 - .../_js.view/solution.js | 9 - .../_js.view/test.js | 55 - .../2-logging-decorator-arguments/solution.md | 34 - .../2-logging-decorator-arguments/task.md | 29 - .../3-caching-decorator/_js.view/solution.js | 11 - .../3-caching-decorator/_js.view/test.js | 31 - .../3-caching-decorator/solution.md | 34 - .../8-decorators/3-caching-decorator/task.md | 34 - 1-js/6-objects-more/8-decorators/article.md | 232 -- 1-js/6-objects-more/index.md | 3 - .../_js.view/solution.js | 32 - .../_js.view/test.js | 18 - .../1-format-date-polymorphic/solution.md | 15 - .../1-format-date-polymorphic/task.md | 26 - 1-js/7-js-misc/1-class-instanceof/article.md | 252 -- .../2-json/1-serialize-object/solution.md | 12 - .../2-json/1-serialize-object/task.md | 14 - .../2-serialize-object-circular/solution.md | 64 - .../2-serialize-object-circular/task.md | 26 - 1-js/7-js-misc/2-json/article.md | 366 --- .../1-output-numbers-100ms/solution.md | 17 - .../1-output-numbers-100ms/task.md | 21 - .../solution.md | 17 - .../2-output-numbers-100ms-settimeout/task.md | 5 - .../3-highlight-tactics/solution.md | 5 - .../3-highlight-tactics/task.md | 34 - .../4-settimeout-result/solution.md | 8 - .../4-settimeout-result/task.md | 31 - .../5-setinterval-result/solution.md | 37 - .../5-setinterval-result/task.md | 44 - .../6-who-runs-faster/solution.md | 55 - .../6-who-runs-faster/task.md | 35 - .../7-delay/_js.view/solution.js | 12 - .../7-delay/_js.view/test.js | 46 - .../7-delay/solution.md | 46 - .../3-settimeout-setinterval/7-delay/task.md | 23 - .../8-debounce/_js.view/solution.js | 19 - .../8-debounce/_js.view/test.js | 47 - .../8-debounce/solution.md | 38 - .../8-debounce/task.md | 25 - .../9-throttle/_js.view/solution.js | 29 - .../9-throttle/_js.view/test.js | 47 - .../9-throttle/solution.md | 42 - .../9-throttle/task.md | 52 - .../3-settimeout-setinterval/article.md | 326 -- .../setinterval-anim.view/index.html | 59 - .../setinterval-interval.png | Bin 8216 -> 0 bytes .../setinterval-interval@2x.png | Bin 20136 -> 0 bytes .../settimeout-interval.png | Bin 8049 -> 0 bytes .../settimeout-interval@2x.png | Bin 20113 -> 0 bytes .../4-eval/1-eval-calculator/solution.md | 12 - .../4-eval/1-eval-calculator/task.md | 9 - 1-js/7-js-misc/4-eval/article.md | 266 -- .../1-finally-or-code-after/solution.md | 43 - .../1-finally-or-code-after/task.md | 43 - .../2-eval-calculator-errors/solution.md | 36 - .../2-eval-calculator-errors/task.md | 13 - 1-js/7-js-misc/5-exception/article.md | 590 ---- 1-js/7-js-misc/index.md | 3 - 1-js/8-oop/1-about-oop/article.md | 56 - .../solution.md | 42 - .../task.md | 43 - .../2-internal-external-interface/article.md | 338 --- .../coffee-inside.jpg | Bin 61294 -> 0 bytes .../2-internal-external-interface/coffee.jpg | Bin 12546 -> 0 bytes .../1-object-with-getters-setters/solution.md | 29 - .../1-object-with-getters-setters/task.md | 25 - .../2-getter-power/solution.md | 28 - .../3-getters-setters/2-getter-power/task.md | 32 - .../3-add-public-coffeemachine/solution.md | 47 - .../3-add-public-coffeemachine/task.md | 52 - .../4-setter-onready/solution.md | 69 - .../4-setter-onready/task.md | 59 - .../5-coffeemachine-add-isrunning/solution.md | 62 - .../5-coffeemachine-add-isrunning/task.md | 25 - 1-js/8-oop/3-getters-setters/article.md | 167 -- .../1-coffeemachine-fix-run/solution.md | 15 - .../solution.view/index.html | 51 - .../source.view/index.html | 45 - .../1-coffeemachine-fix-run/task.md | 21 - .../2-coffeemachine-disable-stop/solution.md | 0 .../solution.view/index.html | 58 - .../2-coffeemachine-disable-stop/task.md | 16 - .../3-inherit-fridge/solution.md | 29 - .../3-inherit-fridge/task.md | 67 - .../4-add-methods-fridge/solution.md | 89 - .../4-add-methods-fridge/task.md | 48 - .../5-override-disable/solution.md | 68 - .../5-override-disable/task.md | 17 - .../8-oop/5-functional-inheritance/article.md | 403 --- 1-js/8-oop/index.md | 3 - .../1-property-after-delete/solution.md | 5 - .../1-property-after-delete/task.md | 28 - .../1-prototype/2-proto-and-this/proto5.png | Bin 2059 -> 0 bytes .../1-prototype/2-proto-and-this/proto6.png | Bin 1840 -> 0 bytes .../1-prototype/2-proto-and-this/solution.md | 18 - .../1-prototype/2-proto-and-this/task.md | 24 - .../3-search-algorithm/solution.md | 33 - .../1-prototype/3-search-algorithm/task.md | 32 - 1-js/9-prototypes/1-prototype/article.md | 246 -- .../1-prototype/proto-animal-rabbit.png | Bin 7578 -> 0 bytes .../1-prototype/proto-animal-rabbit@2x.png | Bin 17501 -> 0 bytes .../1-prototype-after-new/solution.md | 9 - .../1-prototype-after-new/task.md | 89 - .../2-default-arguments/solution.md | 15 - .../2-default-arguments/task.md | 27 - .../3-compare-calls/solution.md | 33 - .../2-new-prototype/3-compare-calls/task.md | 27 - .../4-new-object-same-constructor/solution.md | 34 - .../4-new-object-same-constructor/task.md | 13 - 1-js/9-prototypes/2-new-prototype/article.md | 229 -- .../1-defer-to-prototype/solution.md | 15 - .../1-defer-to-prototype/task.md | 16 - .../2-defer-to-prototype-extended/solution.md | 23 - .../2-defer-to-prototype-extended/task.md | 19 - .../3-native-prototypes/article.md | 328 -- .../native-prototype-object.png | 1 - .../native-prototypes-array-tostring.png | Bin 18613 -> 0 bytes .../native-prototypes-array-tostring@2x.png | Bin 40803 -> 0 bytes .../native-prototypes-classes.png | Bin 44747 -> 0 bytes .../native-prototypes-classes@2x.png | Bin 98810 -> 0 bytes .../native-prototypes-object.png | Bin 14070 -> 0 bytes .../native-prototypes-object@2x.png | Bin 31376 -> 0 bytes .../4-classes/1-rewrite-by-class/solution.md | 32 - .../4-classes/1-rewrite-by-class/task.md | 39 - .../2-hamsters-with-proto/solution.md | 52 - .../4-classes/2-hamsters-with-proto/task.md | 33 - 1-js/9-prototypes/4-classes/article.md | 128 - .../1-inheritance-error-assign/solution.md | 44 - .../1-inheritance-error-assign/task.md | 25 - .../solution.md | 18 - .../2-inheritance-error-constructor/task.md | 30 - .../3-clock-class/clock.js | 32 - .../3-clock-class/solution.md | 7 - .../3-clock-class/solution.view/clock.js | 32 - .../3-clock-class/solution.view/index.html | 21 - .../3-clock-class/source.view/clock.js | 32 - .../3-clock-class/source.view/index.html | 21 - .../5-class-inheritance/3-clock-class/task.md | 11 - .../4-clock-class-extended/extended-clock.js | 14 - .../4-clock-class-extended/solution.md | 7 - .../solution.view/clock.js | 32 - .../solution.view/extended-clock.js | 14 - .../solution.view/index.html | 26 - .../source.view/clock.js | 32 - .../source.view/extended-clock.js | 13 - .../source.view/index.html | 35 - .../4-clock-class-extended/task.md | 15 - .../5-menu-timer-animated/solution.md | 3 - .../solution.view/index.html | 64 - .../solution.view/menu.js | 28 - .../source.view/index.html | 33 - .../5-menu-timer-animated/source.view/menu.js | 28 - .../5-menu-timer-animated/task.md | 14 - .../6-constructor-inherited/solution.md | 26 - .../6-constructor-inherited/task.md | 19 - .../5-class-inheritance/article.md | 358 --- .../class-inheritance-array-object.png | Bin 17917 -> 0 bytes .../class-inheritance-array-object@2x.png | Bin 40174 -> 0 bytes .../class-inheritance-rabbit-animal.png | Bin 20052 -> 0 bytes .../class-inheritance-rabbit-animal@2x.png | Bin 46042 -> 0 bytes .../class-inheritance-rabbit-run-animal.png | Bin 21983 -> 0 bytes ...class-inheritance-rabbit-run-animal@2x.png | Bin 49532 -> 0 bytes .../5-class-inheritance/console_dir_array.png | Bin 17005 -> 0 bytes .../console_dir_array@2x.png | Bin 35086 -> 0 bytes .../1-strange-instanceof/solution.md | 7 - .../6-instanceof/1-strange-instanceof/task.md | 21 - .../2-instanceof-result/solution.md | 18 - .../6-instanceof/2-instanceof-result/task.md | 23 - 1-js/9-prototypes/6-instanceof/article.md | 91 - .../7-oop-errors/1-format-error/solution.md | 28 - .../7-oop-errors/1-format-error/task.md | 17 - 1-js/9-prototypes/7-oop-errors/article.md | 285 -- 1-js/9-prototypes/8-mixins/article.md | 170 -- 1-js/9-prototypes/index.md | 3 - .../1-regexp-introduction/article.md | 104 - .../10-regexp-ahchors/1-start-end/solution.md | 6 - .../10-regexp-ahchors/1-start-end/task.md | 4 - .../10-regexp-ahchors/2-test-mac/solution.md | 21 - .../10-regexp-ahchors/2-test-mac/task.md | 20 - .../10-regexp-ahchors/article.md | 68 - .../11-regexp-multiline-mode/article.md | 89 - .../12-regexp-lookahead/article.md | 4 - .../article.md | 305 -- .../bad_backtrack_greedy1.png | Bin 2357 -> 0 bytes .../bad_backtrack_greedy11.png | Bin 1119 -> 0 bytes .../bad_backtrack_greedy2.png | Bin 2503 -> 0 bytes .../bad_backtrack_greedy3.png | Bin 2505 -> 0 bytes .../bad_backtrack_greedy4.png | Bin 2552 -> 0 bytes .../bad_backtrack_greedy5.png | Bin 2462 -> 0 bytes .../2-regexp-methods/article.md | 392 --- .../1-find-time-hh-mm/solution.md | 8 - .../1-find-time-hh-mm/task.md | 8 - .../3-regexp-character-classes/article.md | 271 -- .../hello-java-boundaries.png | Bin 3614 -> 0 bytes .../hello-java-boundaries@2x.png | Bin 6841 -> 0 bytes .../love-html5-classes.png | Bin 4722 -> 0 bytes .../love-html5-classes@2x.png | Bin 8220 -> 0 bytes .../1-find-range-1/solution.md | 18 - .../1-find-range-1/task.md | 5 - .../2-find-time-2-formats/solution.md | 9 - .../2-find-time-2-formats/task.md | 11 - .../article.md | 170 -- .../1-find-text-manydots/solution.md | 11 - .../1-find-text-manydots/task.md | 13 - .../2-find-html-colors-6hex/solution.md | 34 - .../2-find-html-colors-6hex/task.md | 14 - .../solution.md | 18 - .../3-find-decimal-positive-numbers/task.md | 13 - .../4-find-decimal-numbers/solution.md | 13 - .../4-find-decimal-numbers/task.md | 13 - .../5-regexp-quantifiers/article.md | 168 -- .../1-lazy-greedy/solution.md | 6 - .../1-lazy-greedy/task.md | 8 - .../2-difference-find-quote/solution.md | 16 - .../2-difference-find-quote/task.md | 5 - .../3-find-html-comments/solution.md | 18 - .../3-find-html-comments/task.md | 11 - .../4-find-html-tags-greedy-lazy/solution.md | 38 - .../4-find-html-tags-greedy-lazy/task.md | 18 - .../6-regexp-greedy-and-lazy/article.md | 335 --- .../witch_greedy1.png | Bin 8828 -> 0 bytes .../witch_greedy1@2x.png | Bin 15909 -> 0 bytes .../witch_greedy2.png | Bin 8542 -> 0 bytes .../witch_greedy2@2x.png | Bin 14976 -> 0 bytes .../witch_greedy3.png | Bin 10907 -> 0 bytes .../witch_greedy3@2x.png | Bin 20119 -> 0 bytes .../witch_greedy4.png | Bin 10935 -> 0 bytes .../witch_greedy4@2x.png | Bin 20053 -> 0 bytes .../witch_greedy5.png | Bin 10914 -> 0 bytes .../witch_greedy5@2x.png | Bin 19924 -> 0 bytes .../witch_greedy6.png | Bin 10410 -> 0 bytes .../witch_greedy6@2x.png | Bin 18965 -> 0 bytes .../6-regexp-greedy-and-lazy/witch_lazy3.png | Bin 8670 -> 0 bytes .../witch_lazy3@2x.png | Bin 15188 -> 0 bytes .../6-regexp-greedy-and-lazy/witch_lazy4.png | Bin 8799 -> 0 bytes .../witch_lazy4@2x.png | Bin 15533 -> 0 bytes .../6-regexp-greedy-and-lazy/witch_lazy5.png | Bin 9045 -> 0 bytes .../witch_lazy5@2x.png | Bin 16112 -> 0 bytes .../6-regexp-greedy-and-lazy/witch_lazy6.png | Bin 9885 -> 0 bytes .../witch_lazy6@2x.png | Bin 17631 -> 0 bytes .../1-find-webcolor-3-or-6/solution.md | 30 - .../1-find-webcolor-3-or-6/task.md | 14 - .../2-parse-expression/solution.md | 53 - .../2-parse-expression/task.md | 20 - .../7-regexp-groups/article.md | 150 - .../7-regexp-groups/regexp-nested-groups.png | Bin 12959 -> 0 bytes .../regexp-nested-groups@2x.png | Bin 24479 -> 0 bytes .../1-find-matching-bbtags/solution.md | 21 - .../1-find-matching-bbtags/task.md | 41 - .../8-regexp-backreferences/article.md | 68 - .../1-find-programming-language/solution.md | 36 - .../1-find-programming-language/task.md | 6 - .../2-match-quoted-string/solution.md | 19 - .../2-match-quoted-string/task.md | 26 - .../3-match-exact-tag/solution.md | 18 - .../3-match-exact-tag/task.md | 14 - .../9-regexp-alternation/article.md | 26 - 10-regular-expressions-javascript/index.md | 3 - 11-extra/10-cookie/article.md | 255 -- 11-extra/10-cookie/cookie.js | 45 - 11-extra/10-cookie/safari-nocookie.png | Bin 27935 -> 0 bytes 11-extra/10-cookie/safari-nocookie@2x.png | Bin 72648 -> 0 bytes .../11-intl/1-collate-array-sort/solution.md | 27 - 11-extra/11-intl/1-collate-array-sort/task.md | 17 - 11-extra/11-intl/article.md | 484 --- 11-extra/12-regexp-specials/article.md | 193 -- 11-extra/3-templates/article.md | 308 -- 11-extra/4-books/article.md | 83 - 11-extra/5-setimmediate/article.md | 54 - .../setimmediate.view/index.html | 45 - .../setimmediate.view/setImmediate.js | 27 - 11-extra/6-bind-late/article.md | 160 - 11-extra/7-sublime/article.md | 47 - 11-extra/7-sublime/sheet.pdf | Bin 142604 -> 0 bytes 11-extra/8-range-textrange-selection/56.gif | Bin 4896 -> 0 bytes 11-extra/8-range-textrange-selection/57.gif | Bin 1307 -> 0 bytes 11-extra/8-range-textrange-selection/58.gif | Bin 1916 -> 0 bytes .../8-range-textrange-selection/article.md | 428 --- .../domRangeCreate.view/index.html | 40 - .../domRangeHighlight.view/index.html | 37 - .../fix-ie.view/fixIERangeObject.js | 93 - .../fix-ie.view/index.html | 30 - .../ieTextRangeHighlight.view/index.html | 35 - .../setSelection.view/index.html | 37 - 11-extra/9-drag-and-drop-plus/DragAvatar.js | 83 - 11-extra/9-drag-and-drop-plus/DragManager.js | 120 - 11-extra/9-drag-and-drop-plus/DragZone.js | 39 - 11-extra/9-drag-and-drop-plus/DropTarget.js | 85 - .../9-drag-and-drop-plus/TreeDragAvatar.js | 43 - 11-extra/9-drag-and-drop-plus/TreeDragZone.js | 9 - .../9-drag-and-drop-plus/TreeDropTarget.js | 72 - 11-extra/9-drag-and-drop-plus/article.md | 207 -- .../dragTree.view/DragAvatar.js | 83 - .../dragTree.view/DragManager.js | 120 - .../dragTree.view/DragZone.js | 39 - .../dragTree.view/DropTarget.js | 85 - .../dragTree.view/TreeDragAvatar.js | 43 - .../dragTree.view/TreeDragZone.js | 9 - .../dragTree.view/TreeDropTarget.js | 72 - .../dragTree.view/dragTree.css | 22 - .../dragTree.view/index.html | 73 - .../9-drag-and-drop-plus/dragTree.view/lib.js | 43 - .../9-drag-and-drop-plus/dragzonetarget.png | Bin 11721 -> 0 bytes 11-extra/index.md | 4 - .../1-browser-environment/article.md | 69 - .../1-browser-environment/windowObjects.png | Bin 24328 -> 0 bytes .../windowObjects@2x.png | Bin 53830 -> 0 bytes .../10-compare-document-position/article.md | 170 -- .../1-createtextnode-vs-innerhtml/solution.md | 31 - .../1-createtextnode-vs-innerhtml/task.md | 21 - .../10-clock-setinterval/solution.md | 56 - .../solution.view/index.html | 57 - .../source.view/index.html | 13 - .../10-clock-setinterval/task.md | 8 - .../2-remove-polyfill/solution.md | 23 - .../2-remove-polyfill/task.md | 28 - .../3-insert-after/solution.md | 29 - .../3-insert-after/task.md | 26 - .../4-remove-children/solution.md | 54 - .../4-remove-children/task.md | 29 - .../5-why-aaa/solution.md | 5 - .../11-modifying-document/5-why-aaa/task.md | 25 - .../6-create-list/solution.md | 4 - .../6-create-list/solution.view/index.html | 30 - .../6-create-list/task.md | 18 - .../build-tree-dom.view/index.html | 70 - .../7-create-object-tree/solution.md | 6 - .../solution.view/index.html | 52 - .../source.view/index.html | 67 - .../7-create-object-tree/task.md | 50 - .../8-tree-count/solution.md | 8 - .../8-tree-count/solution.view/index.html | 64 - .../8-tree-count/source.view/index.html | 54 - .../8-tree-count/task.md | 10 - .../9-calendar-table/solution.md | 11 - .../9-calendar-table/solution.view/index.html | 84 - .../9-calendar-table/source.view/index.html | 41 - .../9-calendar-table/task.md | 19 - .../11-modifying-document/article.md | 412 --- .../1-append-to-list/solution.md | 8 - .../12-multi-insert/1-append-to-list/task.md | 15 - .../2-sort-table-performance/solution.md | 11 - .../solution.view/index.html | 202 -- .../2-sort-table-performance/task.md | 48 - 2-ui/1-document/12-multi-insert/article.md | 362 --- .../12-multi-insert/benchmark.view/bench.js | 11 - .../benchmark.view/documentfragment-bench.js | 45 - .../12-multi-insert/benchmark.view/index.html | 23 - .../12-multi-insert/documentfragment-bench.js | 45 - .../12-multi-insert/insert-bench.js | 59 - .../12-multi-insert/insertAdjacentFF.js | 35 - .../12-multi-insert/insertAdjacentHTML.png | Bin 2309 -> 0 bytes 2-ui/1-document/13-document-write/article.md | 149 - .../1-round-button-javascript/solution.md | 43 - .../solution.view/index.html | 40 - .../source.view/index.html | 22 - .../1-round-button-javascript/task.md | 33 - .../2-create-notification/solution.md | 0 .../solution.view/index.css | 14 - .../solution.view/index.html | 65 - .../source.view/index.css | 14 - .../source.view/index.html | 50 - .../2-create-notification/task.md | 41 - .../14-styles-and-classes/article.md | 319 -- .../getiecomputedstyle.js | 18 - .../getiecomputedstyle.view/index.html | 30 - .../1-get-scroll-height-bottom/solution.md | 1 - .../1-get-scroll-height-bottom/task.md | 9 - .../15-metrics/2-scrollbar-width/solution.md | 23 - .../15-metrics/2-scrollbar-width/task.md | 7 - .../15-metrics/3-div-placeholder/solution.md | 29 - .../solution.view/index.html | 50 - .../3-div-placeholder/source.view/index.html | 37 - .../15-metrics/3-div-placeholder/task.md | 52 - .../4-put-ball-in-center/ball-half/index.html | 41 - .../15-metrics/4-put-ball-in-center/field.png | Bin 1693 -> 0 bytes .../4-put-ball-in-center/solution.md | 51 - .../solution.view/index.html | 41 - .../source.view/index.html | 30 - .../15-metrics/4-put-ball-in-center/task.md | 19 - .../15-metrics/5-expand-element/solution.md | 43 - .../5-expand-element/solution.view/index.html | 53 - .../5-expand-element/source.view/index.html | 39 - .../15-metrics/5-expand-element/task.md | 15 - .../6-width-vs-clientwidth/solution.md | 11 - .../15-metrics/6-width-vs-clientwidth/task.md | 7 - 2-ui/1-document/15-metrics/article.md | 317 -- .../15-metrics/cssWidthScroll.view/index.html | 26 - 2-ui/1-document/15-metrics/metric-all.png | Bin 142969 -> 0 bytes 2-ui/1-document/15-metrics/metric-all@2x.png | Bin 315112 -> 0 bytes .../15-metrics/metric-client-left-top-rtl.png | Bin 65151 -> 0 bytes .../metric-client-left-top-rtl@2x.png | Bin 187786 -> 0 bytes .../15-metrics/metric-client-left-top.png | Bin 68390 -> 0 bytes .../15-metrics/metric-client-left-top@2x.png | Bin 193964 -> 0 bytes .../15-metrics/metric-client-width-height.png | Bin 79576 -> 0 bytes .../metric-client-width-height@2x.png | Bin 177030 -> 0 bytes .../metric-client-width-nopadding.png | Bin 62338 -> 0 bytes .../metric-client-width-nopadding@2x.png | Bin 155408 -> 0 bytes 2-ui/1-document/15-metrics/metric-css.png | Bin 75689 -> 0 bytes 2-ui/1-document/15-metrics/metric-css@2x.png | Bin 168491 -> 0 bytes .../15-metrics/metric-offset-parent.png | Bin 113955 -> 0 bytes .../15-metrics/metric-offset-parent@2x.png | Bin 351341 -> 0 bytes .../15-metrics/metric-offset-width-height.png | Bin 85629 -> 0 bytes .../metric-offset-width-height@2x.png | Bin 186048 -> 0 bytes .../15-metrics/metric-scroll-top.png | Bin 119185 -> 0 bytes .../15-metrics/metric-scroll-top@2x.png | Bin 261376 -> 0 bytes .../15-metrics/metric-scroll-width-height.png | Bin 108300 -> 0 bytes .../metric-scroll-width-height@2x.png | Bin 265113 -> 0 bytes .../15-metrics/metric.view/index.html | 94 - .../1-pageyoffset-polyfill/solution.md | 39 - .../1-pageyoffset-polyfill/task.md | 12 - 2-ui/1-document/16-metrics-window/article.md | 213 -- .../document-client-width-height.png | Bin 17073 -> 0 bytes .../document-client-width-height@2x.png | Bin 36239 -> 0 bytes .../1-find-point-coordinates/solution.md | 42 - .../solution.view/index.css | 27 - .../solution.view/index.html | 65 - .../source.view/index.css | 27 - .../source.view/index.html | 42 - .../1-find-point-coordinates/task.md | 24 - .../17-coordinates/2-position-at/solution.md | 0 .../2-position-at/solution.view/index.css | 28 - .../2-position-at/solution.view/index.html | 82 - .../2-position-at/source.view/index.css | 28 - .../2-position-at/source.view/index.html | 55 - .../17-coordinates/2-position-at/task.md | 13 - 2-ui/1-document/17-coordinates/article.md | 201 -- 2-ui/1-document/17-coordinates/coords.png | Bin 10228 -> 0 bytes 2-ui/1-document/17-coordinates/coords@2x.png | Bin 24066 -> 0 bytes .../1-get-document-scrolls/solution.md | 24 - .../1-get-document-scrolls/task.md | 15 - .../2-position-at-absolute/solution.md | 0 .../solution.view/index.css | 28 - .../solution.view/index.html | 100 - .../2-position-at-absolute/task.md | 9 - .../3-position-at-2/solution.md | 0 .../3-position-at-2/solution.view/index.css | 29 - .../3-position-at-2/solution.view/index.html | 115 - .../3-position-at-2/task.md | 27 - .../18-coordinates-document/article.md | 226 -- .../getcoords-compare.png | Bin 9622 -> 0 bytes .../getcoords-compare@2x.png | Bin 16397 -> 0 bytes .../18-coordinates-document/pagewindow0.png | Bin 26598 -> 0 bytes .../18-coordinates-document/screen.png | Bin 22365 -> 0 bytes .../standards-scroll.png | Bin 23446 -> 0 bytes .../18-coordinates-document/standards.png | Bin 26537 -> 0 bytes 2-ui/1-document/19-dom-cheatsheet/article.md | 187 -- .../2-dom-nodes/1-body-from-head/solution.md | 21 - .../2-dom-nodes/1-body-from-head/task.md | 24 - 2-ui/1-document/2-dom-nodes/article.md | 269 -- 2-ui/1-document/3-dom-console/1.png | Bin 28286 -> 0 bytes 2-ui/1-document/3-dom-console/1@2x.png | Bin 57423 -> 0 bytes 2-ui/1-document/3-dom-console/2.png | Bin 28260 -> 0 bytes 2-ui/1-document/3-dom-console/2@2x.png | Bin 44086 -> 0 bytes 2-ui/1-document/3-dom-console/3.png | Bin 25328 -> 0 bytes 2-ui/1-document/3-dom-console/3@2x.png | Bin 47823 -> 0 bytes 2-ui/1-document/3-dom-console/article.md | 80 - 2-ui/1-document/3-dom-console/losi.html | 13 - .../1-dom-children/solution.md | 32 - .../4-traversing-dom/1-dom-children/task.md | 38 - .../2-has-childnodes/solution.md | 28 - .../4-traversing-dom/2-has-childnodes/task.md | 14 - .../3-navigation-links-which-null/solution.md | 10 - .../3-navigation-links-which-null/task.md | 9 - .../4-select-diagonal-cells/solution.md | 1 - .../solution.view/index.html | 66 - .../source.view/index.html | 63 - .../4-select-diagonal-cells/task.md | 17 - 2-ui/1-document/4-traversing-dom/article.md | 433 --- .../4-traversing-dom/dom-links-elements.png | Bin 33183 -> 0 bytes .../dom-links-elements@2x.png | Bin 69465 -> 0 bytes .../1-document/4-traversing-dom/dom-links.png | Bin 31564 -> 0 bytes .../4-traversing-dom/dom-links@2x.png | Bin 68508 -> 0 bytes .../4-traversing-dom/travel.view/index.html | 20 - .../1-find-elements/solution.md | 26 - .../1-find-elements/table.html | 48 - .../1-find-elements/task.md | 20 - .../2-tree-info/solution.md | 18 - .../2-tree-info/solution.view/index.html | 66 - .../2-tree-info/source.view/index.html | 54 - .../2-tree-info/task.md | 14 - .../5-searching-elements-dom/article.md | 382 --- .../solution.md | 47 - .../1-collection-length-after-remove/task.md | 35 - .../2-compare-elements-count/solution.md | 5 - .../2-compare-elements-count/task.md | 13 - .../3-benchmark-search-dom/solution.md | 31 - .../solution.view/index.html | 207 -- .../source.view/index.html | 170 -- .../3-benchmark-search-dom/task.md | 11 - .../4-get-second-li/solution.md | 21 - .../4-get-second-li/task.md | 16 - .../6-searching-elements-internals/article.md | 172 -- .../console-innerhtml.png | Bin 10438 -> 0 bytes .../console-innerhtml@2x.png | Bin 17069 -> 0 bytes .../solution.md | 18 - .../1-console-firstchild-innerhtml/task.md | 12 - .../2-lastchild-nodetype-inline/solution.md | 18 - .../2-lastchild-nodetype-inline/task.md | 19 - .../3-tag-in-comment/solution.md | 19 - .../3-tag-in-comment/task.md | 16 - .../4-where-document-in-hierarchy/solution.md | 72 - .../4-where-document-in-hierarchy/task.md | 11 - .../7-basic-dom-node-properties/article.md | 555 ---- .../7-basic-dom-node-properties/hierarchy.png | Bin 10361 -> 0 bytes .../1-polyfill-matches/solution.md | 21 - .../8-dom-polyfill/1-polyfill-matches/task.md | 7 - .../2-polyfill-closest/solution.md | 24 - .../8-dom-polyfill/2-polyfill-closest/task.md | 7 - .../3-polyfill-textcontent-ie8/solution.md | 29 - .../3-polyfill-textcontent-ie8/task.md | 9 - 2-ui/1-document/8-dom-polyfill/article.md | 222 -- .../1-get-user-attribute/solution.md | 20 - .../solution.view/index.html | 14 - .../1-get-user-attribute/task.md | 24 - .../2-set-class-links/solution.md | 56 - .../solution.view/index.html | 38 - .../2-set-class-links/task.md | 31 - .../article.md | 555 ---- 2-ui/1-document/index.md | 3 - .../1-hide-other/solution.md | 0 .../1-hide-other/solution.view/index.html | 23 - .../1-hide-other/source.view/index.html | 19 - .../1-hide-other/task.md | 10 - .../2-hide-self-onclick/solution.md | 7 - .../2-hide-self-onclick/task.md | 10 - .../3-which-handlers-run/solution.md | 16 - .../3-which-handlers-run/task.md | 19 - .../4-sliding-menu/solution.md | 67 - .../4-sliding-menu/solution.view/index.html | 58 - .../4-sliding-menu/source.view/index.html | 20 - .../4-sliding-menu/task.md | 10 - .../5-hide-message/solution.md | 10 - .../5-hide-message/solution.view/index.html | 47 - .../5-hide-message/solution.view/messages.css | 36 - .../5-hide-message/source.view/index.html | 33 - .../5-hide-message/source.view/messages.css | 31 - .../5-hide-message/task.md | 12 - .../6-carousel/carousel1.png | Bin 11712 -> 0 bytes .../6-carousel/carousel1@2x.png | Bin 26455 -> 0 bytes .../6-carousel/carousel2.png | Bin 13402 -> 0 bytes .../6-carousel/carousel2@2x.png | Bin 31491 -> 0 bytes .../6-carousel/solution.md | 19 - .../6-carousel/solution.view/index.html | 68 - .../6-carousel/solution.view/style.css | 72 - .../6-carousel/source.view/index.html | 48 - .../6-carousel/source.view/style.css | 46 - .../6-carousel/task.md | 12 - .../1-introduction-browser-events/article.md | 503 ---- .../2-events-and-timing-depth/article.md | 180 -- .../1-move-ball-field/solution.md | 35 - .../solution.view/index.html | 92 - .../1-move-ball-field/source.view/index.html | 40 - .../1-move-ball-field/task.md | 22 - .../3-obtaining-event-object/article.md | 110 - .../4-event-bubbling/article.md | 261 -- .../4-event-bubbling/both.view/example.css | 33 - .../4-event-bubbling/both.view/index.html | 20 - .../4-event-bubbling/both.view/script.js | 12 - .../bubble-target.view/example.css | 33 - .../bubble-target.view/index.html | 21 - .../bubble-target.view/script.js | 9 - .../4-event-bubbling/capture.view/example.css | 33 - .../4-event-bubbling/capture.view/index.html | 16 - .../4-event-bubbling/capture.view/script.js | 11 - .../4-event-bubbling/event-order-bubbling.png | Bin 11369 -> 0 bytes .../event-order-bubbling@2x.png | Bin 25044 -> 0 bytes .../4-event-bubbling/eventflow.png | Bin 78653 -> 0 bytes .../4-event-bubbling/eventflow@2x.png | Bin 175388 -> 0 bytes .../1-hide-message-delegate/solution.md | 2 - .../solution.view/index.html | 45 - .../solution.view/messages.css | 37 - .../source.view/index.html | 33 - .../source.view/messages.css | 32 - .../1-hide-message-delegate/task.md | 11 - .../2-sliding-tree/solution.md | 112 - .../2-sliding-tree/solution.view/index.html | 89 - .../2-sliding-tree/source.view/index.html | 50 - .../5-event-delegation/2-sliding-tree/task.md | 18 - .../3-sort-table/solution.md | 19 - .../3-sort-table/solution.view/index.html | 106 - .../3-sort-table/source.view/index.html | 56 - .../5-event-delegation/3-sort-table/task.md | 20 - .../5-event-delegation/article.md | 239 -- .../5-event-delegation/bagua-bubble.png | Bin 9707 -> 0 bytes .../5-event-delegation/bagua-bubble@2x.png | Bin 21689 -> 0 bytes .../5-event-delegation/bagua.view/bagua.css | 59 - .../5-event-delegation/bagua.view/index.html | 94 - .../6-behavior/1-behavior-tooltip/solution.md | 0 .../solution.view/index.html | 81 - .../1-behavior-tooltip/source.view/index.html | 32 - .../6-behavior/1-behavior-tooltip/task.md | 33 - .../6-behavior/article.md | 98 - .../1-why-return-false-fails/solution.md | 42 - .../1-why-return-false-fails/task.md | 21 - .../2-catch-link-navigation/solution.md | 28 - .../solution.view/index.html | 43 - .../source.view/index.html | 25 - .../2-catch-link-navigation/task.md | 18 - .../3-image-gallery/solution.md | 55 - .../3-image-gallery/solution.view/gallery.css | 44 - .../3-image-gallery/solution.view/index.html | 70 - .../3-image-gallery/source.view/gallery.css | 35 - .../3-image-gallery/source.view/index.html | 25 - .../3-image-gallery/task.md | 20 - .../7-default-browser-action/article.md | 154 - .../menu.view/index.html | 22 - .../menu.view/menu.css | 25 - .../menu.view/menu.js | 8 - .../8-dispatch-events/article.md | 452 --- 2-ui/2-events-and-interfaces/index.md | 3 - .../1-selectable-list/solution.md | 0 .../solution.view/index.html | 100 - .../1-selectable-list/source.view/index.html | 38 - .../1-mouse-clicks/1-selectable-list/task.md | 20 - .../1-mouse-clicks/2-tree-coords/solution.md | 28 - .../2-tree-coords/solution.view/index.html | 94 - .../2-tree-coords/source.view/index.html | 70 - .../1-mouse-clicks/2-tree-coords/task.md | 37 - .../3-event-details/1-mouse-clicks/article.md | 327 -- .../10-onload-ondomcontentloaded/article.md | 214 -- .../window-onbeforeunload.view/index.html | 22 - .../11-onload-onerror/1-nice-alt/solution.md | 8 - .../1-nice-alt/solution.view/index.html | 49 - .../1-nice-alt/source.view/index.html | 40 - .../11-onload-onerror/1-nice-alt/task.md | 17 - .../2-load-img-callback/solution.md | 8 - .../solution.view/index.html | 57 - .../source.view/index.html | 50 - .../2-load-img-callback/task.md | 23 - .../3-script-callback/solution.md | 18 - .../3-script-callback/solution.view/go.js | 3 - .../solution.view/index.html | 42 - .../3-script-callback/source.view/go.js | 3 - .../3-script-callback/source.view/index.html | 22 - .../3-script-callback/task.md | 19 - .../4-scripts-callback/solution.md | 8 - .../4-scripts-callback/solution.view/a.js | 3 - .../4-scripts-callback/solution.view/b.js | 3 - .../4-scripts-callback/solution.view/c.js | 3 - .../solution.view/index.html | 54 - .../4-scripts-callback/source.view/a.js | 3 - .../4-scripts-callback/source.view/b.js | 3 - .../4-scripts-callback/source.view/c.js | 3 - .../4-scripts-callback/source.view/index.html | 21 - .../4-scripts-callback/task.md | 24 - .../11-onload-onerror/article.md | 241 -- .../3-event-details/2-unselectable/article.md | 186 -- .../1-behavior-nested-tooltip/solution.md | 0 .../solution.view/index.html | 132 - .../source.view/index.html | 52 - .../1-behavior-nested-tooltip/task.md | 25 - .../2-hoverintent/solution.md | 19 - .../solution.view/hoverIntent.js | 75 - .../2-hoverintent/solution.view/index.html | 43 - .../2-hoverintent/solution.view/style.css | 26 - .../2-hoverintent/source.view/hoverIntent.js | 3 - .../2-hoverintent/source.view/index.html | 43 - .../2-hoverintent/source.view/style.css | 26 - .../2-hoverintent/task.md | 47 - .../article.md | 229 -- .../index.html | 74 - .../script.js | 46 - .../style.css | 65 - .../index.html | 79 - .../script.js | 13 - .../style.css | 65 - .../mouseleave-table.view/index.html | 79 - .../mouseleave-table.view/script.js | 6 - .../mouseleave-table.view/style.css | 65 - .../mouseleave.view/index.html | 22 - .../mouseleave.view/script.js | 4 - .../mouseleave.view/style.css | 21 - .../mouseover-mouseout-from-outside.png | Bin 10592 -> 0 bytes .../mouseover-mouseout-from-outside@2x.png | Bin 22355 -> 0 bytes .../mouseover-mouseout-over-elems.png | Bin 9283 -> 0 bytes .../mouseover-mouseout-over-elems@2x.png | Bin 19985 -> 0 bytes .../mouseover-mouseout.png | Bin 6094 -> 0 bytes .../mouseover-mouseout@2x.png | Bin 12391 -> 0 bytes .../mouseover-to-child.png | Bin 6273 -> 0 bytes .../mouseover-to-child@2x.png | Bin 15620 -> 0 bytes .../mouseoverout-child.view/index.html | 23 - .../mouseoverout-child.view/script.js | 4 - .../mouseoverout-child.view/style.css | 21 - .../mouseoverout-fast.view/index.html | 23 - .../mouseoverout-fast.view/script.js | 47 - .../mouseoverout-fast.view/style.css | 23 - .../mouseoverout.view/index.html | 37 - .../mouseoverout.view/script.js | 21 - .../mouseoverout.view/style.css | 165 - .../4-drag-and-drop/1-slider/solution.md | 6 - .../1-slider/solution.view/index.html | 66 - .../1-slider/solution.view/style.css | 21 - .../1-slider/source.view/index.html | 21 - .../1-slider/source.view/style.css | 21 - .../4-drag-and-drop/1-slider/task.md | 14 - .../4-drag-and-drop/2-drag-heroes/solution.md | 5 - .../2-drag-heroes/solution.view/index.html | 37 - .../2-drag-heroes/solution.view/soccer.css | 48 - .../2-drag-heroes/solution.view/soccer.js | 101 - .../2-drag-heroes/source.view/index.html | 37 - .../2-drag-heroes/source.view/soccer.css | 48 - .../2-drag-heroes/source.view/soccer.js | 1 - .../4-drag-and-drop/2-drag-heroes/task.md | 20 - .../4-drag-and-drop/article.md | 221 -- .../4-drag-and-drop/ball.view/index.html | 46 - .../4-drag-and-drop/ball2.view/index.html | 51 - .../4-drag-and-drop/ball3.view/index.html | 65 - .../4-drag-and-drop/ball_shift.png | Bin 8822 -> 0 bytes .../4-drag-and-drop/ball_shift@2x.png | Bin 22517 -> 0 bytes .../5-drag-and-drop-objects/article.md | 531 ---- .../5-drag-and-drop-objects/between.png | Bin 2977 -> 0 bytes .../dragDemo.view/DragManager.js | 157 - .../dragDemo.view/dragDemo.css | 15 - .../dragDemo.view/index.html | 41 - .../5-drag-and-drop-objects/shiftx.png | Bin 1382 -> 0 bytes .../1-scale-with-mouse-wheel/solution.md | 2 - .../solution.view/index.html | 52 - .../1-scale-with-mouse-wheel/task.md | 15 - .../6-mousewheel/2-no-doc-scroll/solution.md | 0 .../solution.view/fix-textarea-scroll.js | 14 - .../2-no-doc-scroll/solution.view/index.html | 41 - .../2-no-doc-scroll/source.view/index.html | 40 - .../6-mousewheel/2-no-doc-scroll/task.md | 27 - 2-ui/3-event-details/6-mousewheel/article.md | 77 - .../6-mousewheel/wheel.view/index.html | 61 - 2-ui/3-event-details/7-fixevent/article.md | 66 - .../1-avatar-above-scroll/solution.md | 0 .../solution.view/index.html | 130 - .../source.view/index.html | 111 - .../8-onscroll/1-avatar-above-scroll/task.md | 11 - .../8-onscroll/2-updown-button/solution.md | 94 - .../2-updown-button/solution.view/index.html | 102 - .../2-updown-button/source.view/index.html | 41 - .../8-onscroll/2-updown-button/task.md | 20 - .../8-onscroll/3-load-visible-img/solution.md | 36 - .../solution.view/index.html | 164 - .../3-load-visible-img/source.view/index.html | 108 - .../8-onscroll/3-load-visible-img/task.md | 50 - 2-ui/3-event-details/8-onscroll/article.md | 31 - .../1-numeric-input/solution.md | 36 - .../1-numeric-input/solution.view/index.html | 49 - .../1-numeric-input/source.view/index.html | 36 - .../9-keyboard-events/1-numeric-input/task.md | 13 - .../2-check-sync-keydown/solution.md | 10 - .../solution.view/index.html | 55 - .../2-check-sync-keydown/task.md | 18 - .../9-keyboard-events/article.md | 338 --- .../keyboard-dump.view/index.html | 45 - .../keyboard-dump.view/script.js | 28 - .../keyboard-dump.view/style.css | 18 - 2-ui/3-event-details/index.md | 5 - .../1-add-select-option/solution.md | 25 - .../1-add-select-option/task.md | 19 - .../1-form-elements/article.md | 318 -- .../4-forms-controls/1-form-elements/form.png | Bin 3860 -> 0 bytes .../1-emulate-placeholder/solution.md | 3 - .../solution.view/index.html | 74 - .../source.view/index.html | 48 - .../1-emulate-placeholder/task.md | 19 - .../2-focus-blur/2-keyboard-mouse/solution.md | 9 - .../2-keyboard-mouse/solution.view/index.html | 65 - .../2-keyboard-mouse/source.view/index.html | 42 - .../2-focus-blur/2-keyboard-mouse/task.md | 11 - .../2-focus-blur/3-hotkeys/solution.md | 100 - .../3-hotkeys/solution.view/index.html | 61 - .../3-hotkeys/solution.view/my.css | 27 - .../3-hotkeys/source.view/index.html | 22 - .../2-focus-blur/3-hotkeys/source.view/my.css | 27 - .../2-focus-blur/3-hotkeys/task.md | 14 - .../2-focus-blur/4-edit-td-click/solution.md | 7 - .../4-edit-td-click/solution.view/bagua.css | 56 - .../4-edit-td-click/solution.view/index.html | 78 - .../4-edit-td-click/solution.view/my.css | 23 - .../4-edit-td-click/solution.view/script.js | 62 - .../4-edit-td-click/source.view/bagua.css | 56 - .../4-edit-td-click/source.view/index.html | 78 - .../4-edit-td-click/source.view/my.css | 1 - .../4-edit-td-click/source.view/script.js | 3 - .../2-focus-blur/4-edit-td-click/task.md | 16 - .../6-input-nice-placeholder/solution.md | 22 - .../solution.view/index.html | 33 - .../solution.view/style.css | 17 - .../source.view/index.html | 21 - .../source.view/style.css | 17 - .../6-input-nice-placeholder/task.md | 11 - .../7-capslock-warning-field/solution.md | 91 - .../solution.view/index.html | 77 - .../source.view/index.html | 19 - .../7-capslock-warning-field/task.md | 10 - 2-ui/4-forms-controls/2-focus-blur/article.md | 340 --- .../1-calculate-capitalization/solution.md | 10 - .../solution.view/index.html | 153 - .../source.view/index.html | 102 - .../1-calculate-capitalization/task.md | 20 - .../3-events-change/article.md | 218 -- .../4-forms-submit/1-modal-dialog/solution.md | 21 - .../1-modal-dialog/solution.view/index.html | 155 - .../1-modal-dialog/source.view/index.html | 65 - .../4-forms-submit/1-modal-dialog/task.md | 34 - .../2-form-validation/solution.md | 0 .../solution.view/index.html | 118 - .../2-form-validation/source.view/index.html | 74 - .../4-forms-submit/2-form-validation/task.md | 17 - .../4-forms-submit/article.md | 65 - 2-ui/4-forms-controls/index.md | 3 - 2-ui/5-widgets/1-architect-intro/article.md | 11 - .../2-widgets-structure/1-clock/solution.md | 0 .../1-clock/solution.view/clock.js | 31 - .../1-clock/solution.view/index.html | 42 - .../1-clock/source.view/index.html | 43 - .../2-widgets-structure/1-clock/task.md | 24 - .../2-slider-widget/solution.md | 1 - .../2-slider-widget/solution.view/index.html | 107 - .../2-slider-widget/task.md | 8 - .../3-selectable-list-component/solution.md | 1 - .../solution.view/index.html | 36 - .../solution.view/listSelect.js | 68 - .../solution.view/style.css | 7 - .../3-selectable-list-component/task.md | 20 - .../2-widgets-structure/4-voter/solution.md | 0 .../4-voter/solution.view/index.html | 73 - .../4-voter/source.view/index.html | 44 - .../2-widgets-structure/4-voter/task.md | 25 - .../5-voter-proto/solution.md | 0 .../5-voter-proto/solution.view/index.html | 27 - .../5-voter-proto/solution.view/style.css | 11 - .../5-voter-proto/solution.view/voter.js | 31 - .../2-widgets-structure/5-voter-proto/task.md | 9 - .../6-voter-add-step/solution.md | 0 .../6-voter-add-step/solution.view/index.html | 30 - .../solution.view/step-voter.js | 13 - .../6-voter-add-step/solution.view/style.css | 11 - .../6-voter-add-step/solution.view/voter.js | 31 - .../6-voter-add-step/task.md | 23 - 2-ui/5-widgets/2-widgets-structure/article.md | 313 -- .../menu-dom.view/index.html | 34 - .../2-widgets-structure/menu-dom.view/menu.js | 61 - .../menu-dom.view/style.css | 23 - .../2-widgets-structure/menu.view/index.html | 32 - .../2-widgets-structure/menu.view/menu.js | 14 - .../2-widgets-structure/menu.view/style.css | 23 - .../1-semantic-menu/solution.md | 35 - .../1-semantic-menu/solution.view/index.html | 56 - .../1-semantic-menu/source.view/index.html | 42 - .../3-widgets-markup/1-semantic-menu/task.md | 47 - 2-ui/5-widgets/3-widgets-markup/article.md | 212 -- .../1-table-template/solution.md | 1 - .../1-table-template/solution.view/index.html | 76 - .../1-table-template/source.view/index.html | 41 - .../1-table-template/task.md | 25 - .../2-template-display-none/solution.md | 5 - .../2-template-display-none/task.md | 7 - .../3-menu-template/solution.md | 5 - .../3-menu-template/solution.view/index.html | 54 - .../3-menu-template/solution.view/menu.css | 23 - .../3-menu-template/solution.view/menu.js | 66 - .../3-menu-template/source.view/index.html | 47 - .../3-menu-template/source.view/menu.css | 23 - .../3-menu-template/source.view/menu.js | 56 - .../4-template-lodash/3-menu-template/task.md | 30 - 2-ui/5-widgets/4-template-lodash/article.md | 584 ---- .../menu-template.view/index.html | 49 - .../menu-template.view/menu.css | 23 - .../menu-template.view/menu.js | 56 - .../4-template-lodash/template-debugger.png | Bin 35419 -> 0 bytes .../template-debugger@2x.png | Bin 64366 -> 0 bytes .../template-error-sourceurl.view/index.html | 31 - .../1-voter-events/solution.md | 1 - .../1-voter-events/solution.view/index.html | 45 - .../1-voter-events/solution.view/voter.js | 39 - .../5-custom-events/1-voter-events/task.md | 26 - .../2-selectable-list-evented/solution.md | 0 .../solution.view/index.html | 38 - .../solution.view/listSelect.js | 80 - .../solution.view/style.css | 7 - .../2-selectable-list-evented/task.md | 12 - .../3-custom-select/solution.md | 9 - .../solution.view/customselect.css | 49 - .../solution.view/customselect.js | 56 - .../3-custom-select/solution.view/index.html | 53 - .../source.view/customselect.css | 49 - .../source.view/customselect.js | 1 - .../3-custom-select/source.view/index.html | 54 - .../5-custom-events/3-custom-select/task.md | 20 - .../4-slider-events/slider.png | Bin 5357 -> 0 bytes .../4-slider-events/solution.md | 34 - .../4-slider-events/solution.view/index.html | 42 - .../4-slider-events/solution.view/slider.css | 20 - .../4-slider-events/solution.view/slider.js | 88 - .../5-custom-events/4-slider-events/task.md | 46 - 2-ui/5-widgets/5-custom-events/article.md | 120 - .../menu-callback.view/index.html | 59 - .../menu-callback.view/menu.css | 23 - .../menu-callback.view/menu.js | 66 - .../menu-event.view/index.html | 53 - .../5-custom-events/menu-event.view/menu.css | 23 - .../5-custom-events/menu-event.view/menu.js | 70 - 2-ui/5-widgets/6-what-next/article.md | 32 - 2-ui/5-widgets/index.md | 3 - 2-ui/index.md | 3 - .../1-webcomponents-intro/article.md | 93 - .../satellite-expanded.jpg | Bin 53660 -> 0 bytes .../satellite-expanded@2x.jpg | Bin 143928 -> 0 bytes .../1-webcomponents-intro/satellite.jpg | Bin 52516 -> 0 bytes .../1-webcomponents-intro/satellite@2x.jpg | Bin 163742 -> 0 bytes .../twitter-components.png | Bin 75075 -> 0 bytes .../twitter-components@2x.png | Bin 223473 -> 0 bytes .../2-webcomponent-core/article.md | 225 -- 3-webcomponents/3-shadow-dom/article.md | 175 -- .../3-shadow-dom/shadow-content.png | Bin 6100 -> 0 bytes .../3-shadow-dom/shadow-content@2x.png | Bin 10235 -> 0 bytes .../3-shadow-dom/shadow-dom-chrome.png | Bin 21439 -> 0 bytes .../3-shadow-dom/shadow-dom-chrome@2x.png | Bin 49046 -> 0 bytes 3-webcomponents/4-template-tag/article.md | 60 - 3-webcomponents/5-css-scoping/article.md | 304 -- 3-webcomponents/6-link-import/article.md | 146 - .../6-link-import/import-show.view/index.html | 17 - .../6-link-import/import-show.view/timer.html | 19 - .../import-style.view/index.html | 10 - .../import-style.view/timer.html | 29 - .../7-webcomponent-build/article.md | 306 -- .../message.view/index.html | 23 - .../message.view/ui-message.html | 55 - .../ui-slider.view/index.html | 29 - .../ui-slider.view/jquery.html | 2 - .../ui-slider.view/ui-slider.html | 60 - 3-webcomponents/index.md | 3 - 4-ajax/1-ajax-intro/article.md | 86 - 4-ajax/1-ajax-intro/suggest.png | Bin 3976 -> 0 bytes 4-ajax/1-ajax-intro/tree.html | 30 - 4-ajax/10-ajax-jsonp/article.md | 154 - 4-ajax/10-ajax-jsonp/jsonp.view/index.html | 33 - .../10-ajax-jsonp/jsonp.view/scriptRequest.js | 48 - 4-ajax/10-ajax-jsonp/jsonp.view/server.js | 39 - 4-ajax/11-server-sent-events/article.md | 298 -- .../eventsource.view/index.html | 62 - .../eventsource.view/server.js | 54 - 4-ajax/12-ajax-iframe/article.md | 397 --- 4-ajax/12-ajax-iframe/comet.png | Bin 5422 -> 0 bytes .../date-activex.view/activex.js | 37 - .../date-activex.view/index.html | 32 - .../date-activex.view/server.js | 42 - .../date-comet.view/iframeComet.js | 83 - .../12-ajax-iframe/date-comet.view/index.html | 28 - .../12-ajax-iframe/date-comet.view/server.js | 43 - 4-ajax/12-ajax-iframe/date.view/iframe.js | 92 - 4-ajax/12-ajax-iframe/date.view/index.html | 24 - 4-ajax/12-ajax-iframe/date.view/server.js | 42 - 4-ajax/13-csrf/article.md | 138 - 4-ajax/14-fetch/article.md | 80 - 4-ajax/14-fetch/user.js | 4 - 4-ajax/15-ajax-summary/article.md | 109 - 4-ajax/2-ajax-nodejs/article.md | 135 - 4-ajax/2-ajax-nodejs/example/index.html | 40 - 4-ajax/2-ajax-nodejs/example/server.js | 30 - .../phones-async.view/index.html | 43 - .../phones-async.view/phones.json | 155 - .../1-phones-list/phones-async.view/server.js | 30 - .../1-phones-list/phones-list.view/index.html | 58 - .../phones-list.view/phones.json | 155 - .../1-phones-list/phones-list.view/server.js | 30 - .../1-phones-list/solution.md | 54 - .../1-phones-list/task.md | 12 - 4-ajax/3-ajax-xmlhttprequest/article.md | 414 --- .../phones-async.view/index.html | 45 - .../phones-async.view/phones.json | 155 - .../phones-async.view/server.js | 30 - .../phones.view/index.html | 31 - .../phones.view/phones.json | 155 - .../phones.view/server.js | 30 - .../readystate.view/index.html | 38 - .../readystate.view/server.js | 42 - 4-ajax/4-xhr-forms/article.md | 302 -- .../1-do-we-need-origin/solution.md | 9 - .../1-do-we-need-origin/task.md | 28 - 4-ajax/5-xhr-crossdomain/article.md | 401 --- .../5-xhr-crossdomain/xhr-another-domain.png | Bin 29785 -> 0 bytes .../xhr-another-domain@2x.png | Bin 65273 -> 0 bytes 4-ajax/5-xhr-crossdomain/xhr-preflight.png | Bin 53941 -> 0 bytes 4-ajax/5-xhr-crossdomain/xhr-preflight@2x.png | Bin 115141 -> 0 bytes 4-ajax/6-xhr-onprogress/article.md | 191 -- .../6-xhr-onprogress/progress.view/index.html | 68 - .../6-xhr-onprogress/progress.view/server.js | 38 - 4-ajax/7-xhr-resume/article.md | 114 - .../upload-resume.view/index.html | 51 - .../7-xhr-resume/upload-resume.view/server.js | 119 - .../upload-resume.view/uploader.js | 105 - 4-ajax/8-xhr-longpoll/article.md | 88 - 4-ajax/8-xhr-longpoll/longpoll.png | Bin 14570 -> 0 bytes .../8-xhr-longpoll/longpoll.view/browser.js | 56 - .../8-xhr-longpoll/longpoll.view/index.html | 29 - 4-ajax/8-xhr-longpoll/longpoll.view/server.js | 76 - 4-ajax/9-websockets/article.md | 493 --- 4-ajax/9-websockets/websocket.zip | Bin 1950 -> 0 bytes 4-ajax/index.md | 3 - 5-animation/1-bezier/article.md | 209 -- 5-animation/1-bezier/bezier-car.png | Bin 6798 -> 0 bytes 5-animation/1-bezier/bezier-car@2x.png | Bin 15217 -> 0 bytes 5-animation/1-bezier/bezier-letter.png | Bin 7517 -> 0 bytes 5-animation/1-bezier/bezier-letter@2x.png | Bin 16259 -> 0 bytes 5-animation/1-bezier/bezier-vase.png | Bin 7365 -> 0 bytes 5-animation/1-bezier/bezier-vase@2x.png | Bin 16860 -> 0 bytes 5-animation/1-bezier/bezier2.png | Bin 3140 -> 0 bytes 5-animation/1-bezier/bezier2@2x.png | Bin 7282 -> 0 bytes 5-animation/1-bezier/bezier3-draw1.png | Bin 21383 -> 0 bytes 5-animation/1-bezier/bezier3-draw1@2x.png | Bin 52773 -> 0 bytes 5-animation/1-bezier/bezier3-draw2.png | Bin 16973 -> 0 bytes 5-animation/1-bezier/bezier3-draw2@2x.png | Bin 42954 -> 0 bytes 5-animation/1-bezier/bezier3-e.png | Bin 4828 -> 0 bytes 5-animation/1-bezier/bezier3-e@2x.png | Bin 10375 -> 0 bytes 5-animation/1-bezier/bezier3.png | Bin 3938 -> 0 bytes 5-animation/1-bezier/bezier3@2x.png | Bin 8875 -> 0 bytes 5-animation/1-bezier/bezier4-e.png | Bin 6990 -> 0 bytes 5-animation/1-bezier/bezier4-e@2x.png | Bin 15781 -> 0 bytes 5-animation/1-bezier/bezier4.png | Bin 4424 -> 0 bytes 5-animation/1-bezier/bezier4@2x.png | Bin 10050 -> 0 bytes 5-animation/1-bezier/demo.svg | 1 - 5-animation/1-bezier/pause.png | Bin 1707 -> 0 bytes 5-animation/1-bezier/play.png | Bin 1711 -> 0 bytes .../1-animate-logo-css/solution.md | 16 - .../solution.view/index.html | 47 - .../1-animate-logo-css/source.view/index.html | 29 - .../1-animate-logo-css/task.md | 16 - .../2-animate-logo-bezier-css/bezier-up.png | Bin 6771 -> 0 bytes .../bezier-up@2x.png | Bin 15975 -> 0 bytes .../2-animate-logo-bezier-css/solution.md | 7 - .../solution.view/index.html | 38 - .../2-animate-logo-bezier-css/task.md | 10 - 5-animation/2-css-transitions/article.md | 457 --- .../2-css-transitions/bezier-linear.png | Bin 3082 -> 0 bytes .../2-css-transitions/bezier-linear@2x.png | Bin 7161 -> 0 bytes .../2-css-transitions/bezier-train-over.png | Bin 11620 -> 0 bytes .../bezier-train-over@2x.png | Bin 26974 -> 0 bytes .../2-css-transitions/boat.view/index.html | 43 - .../2-css-transitions/boat.view/style.css | 13 - .../digits-negative-delay.view/index.html | 16 - .../digits-negative-delay.view/script.js | 5 - .../digits-negative-delay.view/style.css | 12 - .../2-css-transitions/digits.view/index.html | 16 - .../2-css-transitions/digits.view/script.js | 3 - .../2-css-transitions/digits.view/style.css | 12 - 5-animation/2-css-transitions/ease-in-out.png | Bin 4421 -> 0 bytes .../2-css-transitions/ease-in-out@2x.png | Bin 10019 -> 0 bytes 5-animation/2-css-transitions/ease-in.png | Bin 4489 -> 0 bytes 5-animation/2-css-transitions/ease-in@2x.png | Bin 10122 -> 0 bytes 5-animation/2-css-transitions/ease-out.png | Bin 4377 -> 0 bytes 5-animation/2-css-transitions/ease-out@2x.png | Bin 9847 -> 0 bytes 5-animation/2-css-transitions/ease.png | Bin 4403 -> 0 bytes 5-animation/2-css-transitions/ease@2x.png | Bin 10035 -> 0 bytes .../step-end.view/index.html | 22 - .../2-css-transitions/step-end.view/style.css | 12 - .../2-css-transitions/step.view/index.html | 22 - .../2-css-transitions/step.view/style.css | 12 - 5-animation/2-css-transitions/train-curve.png | Bin 4226 -> 0 bytes .../2-css-transitions/train-curve@2x.png | Bin 9863 -> 0 bytes .../train-linear.view/index.html | 15 - .../train-linear.view/style.css | 8 - .../train-over.view/index.html | 15 - .../train-over.view/style.css | 8 - .../2-css-transitions/train.view/index.html | 15 - .../2-css-transitions/train.view/style.css | 8 - .../3-js-animation/1-animate-ball/solution.md | 20 - .../1-animate-ball/solution.view/index.html | 51 - .../1-animate-ball/solution.view/style.css | 10 - .../1-animate-ball/source.view/index.html | 19 - .../1-animate-ball/source.view/style.css | 10 - .../3-js-animation/1-animate-ball/task.md | 8 - .../2-animate-ball-hops/solution.md | 30 - .../solution.view/index.html | 61 - .../solution.view/style.css | 10 - .../2-animate-ball-hops/task.md | 11 - 5-animation/3-js-animation/article.md | 508 ---- 5-animation/3-js-animation/back.png | Bin 7225 -> 0 bytes .../3-js-animation/back.view/index.html | 34 - .../3-js-animation/back.view/style.css | 13 - 5-animation/3-js-animation/back@2x.png | Bin 16256 -> 0 bytes 5-animation/3-js-animation/bezier-linear.png | Bin 3082 -> 0 bytes .../3-js-animation/bezier-linear@2x.png | Bin 7161 -> 0 bytes .../bounce-easeinout.view/index.html | 52 - .../bounce-easeinout.view/style.css | 13 - .../bounce-easeout.view/index.html | 48 - .../bounce-easeout.view/style.css | 13 - 5-animation/3-js-animation/bounce-inout.png | Bin 13225 -> 0 bytes .../3-js-animation/bounce-inout@2x.png | Bin 29302 -> 0 bytes .../3-js-animation/bounce.view/index.html | 38 - .../3-js-animation/bounce.view/style.css | 13 - 5-animation/3-js-animation/circ-ease.png | Bin 14059 -> 0 bytes 5-animation/3-js-animation/circ-ease@2x.png | Bin 30812 -> 0 bytes 5-animation/3-js-animation/circ.png | Bin 6821 -> 0 bytes .../3-js-animation/circ.view/index.html | 34 - .../3-js-animation/circ.view/style.css | 13 - 5-animation/3-js-animation/circ@2x.png | Bin 15231 -> 0 bytes 5-animation/3-js-animation/elastic.png | Bin 11306 -> 0 bytes .../3-js-animation/elastic.view/index.html | 34 - .../3-js-animation/elastic.view/style.css | 13 - 5-animation/3-js-animation/elastic@2x.png | Bin 25615 -> 0 bytes 5-animation/3-js-animation/linear.png | Bin 5961 -> 0 bytes 5-animation/3-js-animation/linear@2x.png | Bin 13820 -> 0 bytes .../3-js-animation/move-raf.view/index.html | 53 - .../3-js-animation/move.view/index.html | 37 - 5-animation/3-js-animation/quad.png | Bin 7060 -> 0 bytes .../3-js-animation/quad.view/index.html | 34 - .../3-js-animation/quad.view/style.css | 13 - 5-animation/3-js-animation/quad@2x.png | Bin 15872 -> 0 bytes 5-animation/3-js-animation/quint.png | Bin 6598 -> 0 bytes .../3-js-animation/quint.view/index.html | 34 - .../3-js-animation/quint.view/style.css | 13 - 5-animation/3-js-animation/quint@2x.png | Bin 14860 -> 0 bytes .../3-js-animation/text.view/index.html | 47 - .../3-js-animation/text.view/style.css | 10 - .../3-js-animation/width.view/animate.js | 20 - .../3-js-animation/width.view/index.html | 36 - 5-animation/index.md | 3 - 6-optimize/1-optimize-intro/article.md | 5 - 6-optimize/2-minification/article.md | 513 ---- 6-optimize/2-minification/my.png | Bin 35168 -> 0 bytes 6-optimize/2-minification/my.svg | 1 - 6-optimize/2-minification/my@2x.png | Bin 60013 -> 0 bytes 6-optimize/3-better-minification/article.md | 172 -- 6-optimize/4-memory-leaks/article.md | 317 -- 6-optimize/4-memory-leaks/chrome.png | Bin 18285 -> 0 bytes 6-optimize/4-memory-leaks/goodluck.png | Bin 17574 -> 0 bytes 6-optimize/4-memory-leaks/ie1.png | Bin 3679 -> 0 bytes 6-optimize/4-memory-leaks/ie2.png | Bin 6387 -> 0 bytes 6-optimize/4-memory-leaks/ie9_disable1.png | Bin 42545 -> 0 bytes 6-optimize/4-memory-leaks/ie9_disable2.png | Bin 18133 -> 0 bytes .../4-memory-leaks/leak-ie8-2.view/index.html | 35 - .../leak-ie8-table.view/index.html | 34 - .../leak-ie8-widget.view/index.html | 40 - .../leak-ie8-xhr.view/index.html | 37 - .../4-memory-leaks/leak-ie8.view/index.html | 39 - 6-optimize/4-memory-leaks/leak-xhr-2.png | Bin 12577 -> 0 bytes 6-optimize/4-memory-leaks/leak-xhr-2@2x.png | Bin 27803 -> 0 bytes 6-optimize/4-memory-leaks/leak-xhr.png | Bin 17176 -> 0 bytes 6-optimize/4-memory-leaks/leak-xhr@2x.png | Bin 39029 -> 0 bytes 6-optimize/5-memory-leaks-jquery/article.md | 144 - .../6-memory-removechild-innerhtml/article.md | 147 - .../html-innerhtml.png | Bin 5445 -> 0 bytes .../html-list.png | Bin 4180 -> 0 bytes .../6-memory-removechild-innerhtml/html.png | Bin 4400 -> 0 bytes .../7-gcc-advanced-optimization/article.md | 530 ---- 6-optimize/8-gcc-check-types/article.md | 177 -- 6-optimize/9-gcc-closure-library/article.md | 180 -- 6-optimize/index.md | 4 - .../1-window-methods/article.md | 241 -- 7-frames-and-windows/2-iframes/article.md | 178 -- .../2-iframes/sandbox.view/index.html | 14 - .../2-iframes/sandbox.view/sandboxed.html | 21 - .../3-same-origin-policy/article.md | 135 - .../article.md | 102 - .../5-window-focus/article.md | 167 -- .../6-clickjacking/article.md | 202 -- .../clickjacking-visible.view/facebook.html | 10 - .../clickjacking-visible.view/index.html | 35 - .../clickjacking.view/facebook.html | 10 - .../clickjacking.view/index.html | 35 - .../top-location.view/iframe.html | 18 - .../top-location.view/index.html | 44 - 7-frames-and-windows/index.md | 2 - 8-css-for-js/1-css-why/article.md | 75 - 8-css-for-js/10-box-sizing/article.md | 191 -- 8-css-for-js/10-box-sizing/border-box.png | Bin 27565 -> 0 bytes 8-css-for-js/10-box-sizing/border-box@2x.png | Bin 59837 -> 0 bytes .../11-margin/1-failing-margins/solution.md | 5 - .../11-margin/1-failing-margins/task.md | 43 - .../2-position-text-into-input/solution.md | 30 - .../solution.view/index.html | 29 - .../source.view/index.html | 20 - .../2-position-text-into-input/task.md | 15 - 8-css-for-js/11-margin/article.md | 173 -- .../h2-margin-top-position.view/index.html | 43 - .../11-margin/h2-margin-top.view/index.html | 43 - .../hr-margin-left-src.view/index.html | 43 - .../11-margin/hr-margin-left.view/index.html | 52 - .../negative-margin-bottom.view/index.html | 40 - 8-css-for-js/12-space-under-img/article.md | 148 - .../12-space-under-img/block.view/index.html | 31 - .../inline-p.view/index.html | 27 - .../12-space-under-img/inline.view/index.html | 27 - .../valign-p.view/index.html | 27 - .../valign-small-lh.view/index.html | 27 - .../valign-small.view/index.html | 27 - .../12-space-under-img/valign.view/index.html | 27 - 8-css-for-js/13-overflow/article.md | 162 - 8-css-for-js/14-height-percent/article.md | 141 - .../index.html | 44 - .../height-percent-float.view/index.html | 44 - .../height-percent.view/index.html | 47 - .../1-select-elements-selector/index.html | 79 - .../1-select-elements-selector/solution.md | 6 - .../source.view/index.html | 87 - .../1-select-elements-selector/task.md | 41 - .../2-margin-between-pairs-size-1/solution.md | 30 - .../solution.view/index.html | 36 - .../source.view/index.html | 32 - .../2-margin-between-pairs-size-1/task.md | 37 - .../3-margin-between-pairs/index.html | 36 - .../3-margin-between-pairs/solution.md | 26 - .../solution.view/index.html | 36 - .../source.view/index.html | 32 - .../3-margin-between-pairs/task.md | 37 - 8-css-for-js/15-css-selectors/article.md | 254 -- .../nthchild-type.view/index.html | 40 - .../15-css-selectors/nthchild.view/index.html | 37 - .../15-css-selectors/relation.view/index.html | 71 - 8-css-for-js/17-css-sprite/article.gif | Bin 255 -> 0 bytes 8-css-for-js/17-css-sprite/article.md | 209 -- .../17-css-sprite/height48.view/index.html | 36 - 8-css-for-js/17-css-sprite/icons.gif | Bin 767 -> 0 bytes 8-css-for-js/17-css-sprite/minus.gif | Bin 535 -> 0 bytes 8-css-for-js/17-css-sprite/plus.gif | Bin 535 -> 0 bytes .../17-css-sprite/sprite-example/index.html | 27 - .../sprite-tree-1/height48.view/index.html | 36 - .../17-css-sprite/sprite-tree-1/index.html | 36 - .../sprite-tree-src.view/index.html | 68 - .../17-css-sprite/sprite-tree.view/index.html | 69 - .../17-css-sprite/sprites-example-lines2.png | Bin 7976 -> 0 bytes .../17-css-sprite/sprites-example.png | Bin 7021 -> 0 bytes 8-css-for-js/18-css-format/article.md | 151 - 8-css-for-js/2-css-units/article.md | 319 -- 8-css-for-js/3-display/article.md | 265 -- .../gallery-float-diffsize.png | Bin 20309 -> 0 bytes .../gallery-float-diffsize.view/index.html | 75 - .../gallery-inline-block.view/index.html | 61 - .../1-inline-block-vs-float/solution.md | 45 - .../solution.view/index.html | 71 - .../4-float/1-inline-block-vs-float/task.md | 16 - .../2-tree-with-multiline-nodes/solution.md | 2 - .../solution.view/index.html | 68 - .../source.view/index.html | 45 - .../2-tree-with-multiline-nodes/task.md | 18 - .../nav-div-wrong/arrow-left.jpg | Bin 1908 -> 0 bytes .../nav-div-wrong/arrow-right.jpg | Bin 1896 -> 0 bytes .../3-paginator-css/nav-div-wrong/index.html | 44 - .../4-float/3-paginator-css/solution.md | 101 - .../3-paginator-css/solution.view/index.html | 63 - .../3-paginator-css/source.view/index.html | 41 - 8-css-for-js/4-float/3-paginator-css/task.md | 17 - .../4-add-border-keep-width/solution.md | 41 - .../4-float/4-add-border-keep-width/task.md | 36 - 8-css-for-js/4-float/article.md | 439 --- 8-css-for-js/4-float/float-small-margin.png | Bin 46260 -> 0 bytes .../4-float/gallery-float.view/index.html | 71 - 8-css-for-js/4-float/text.png | Bin 77725 -> 0 bytes .../4-float/two-columns-2.view/index.html | 72 - .../4-float/two-columns.view/index.html | 71 - .../4-float/winnie-block-bg.view/index.html | 36 - .../4-float/winnie-block.view/index.html | 33 - .../4-float/winnie-clear-1.view/index.html | 51 - .../4-float/winnie-clear-2.view/index.html | 52 - .../4-float/winnie-clear-3.view/index.html | 52 - .../4-float/winnie-clear-4.view/index.html | 42 - .../winnie-clearfill-clearfix.view/index.html | 55 - .../winnie-clearfill-div.view/index.html | 44 - .../winnie-clearfill-float.view/index.html | 44 - .../winnie-clearfill-overflow.view/index.html | 44 - .../4-float/winnie-nofloat-1.view/index.html | 29 - .../4-float/winnie-nofloat-2.view/index.html | 29 - .../4-float/winnie-nofloat-3.view/index.html | 28 - .../4-float/winnie-nofloat.view/index.html | 28 - 8-css-for-js/4-float/winnie.view/index.html | 49 - .../5-position/1-modal-window/solution.md | 20 - .../1-modal-window/solution.view/index.html | 53 - .../1-modal-window/source.view/index.html | 47 - .../5-position/1-modal-window/task.md | 17 - 8-css-for-js/5-position/article.md | 374 --- .../position-100-wrong.view/index.html | 21 - .../1-center-ball-css/solution.md | 13 - .../solution.view/index.html | 34 - .../1-center-ball-css/source.view/index.html | 30 - .../6-css-center/1-center-ball-css/task.md | 20 - .../6-css-center/2-form-modal/solution.md | 11 - .../2-form-modal/solution.view/index.html | 94 - .../2-form-modal/source.view/index.html | 21 - .../6-css-center/2-form-modal/task.md | 23 - .../solution.md | 29 - .../task.md | 28 - 8-css-for-js/6-css-center/article.md | 412 --- .../vertical-align.view/index.html | 23 - .../7-font-size-line-height/article.md | 127 - 8-css-for-js/8-white-space/article.md | 124 - 8-css-for-js/9-outline/article.md | 45 - 8-css-for-js/index.md | 2 - 9-tools/1-tools-browser-extensions/article.md | 129 - .../1-tools-browser-extensions/dnsflusher.png | Bin 838 -> 0 bytes .../downloadhelper.jpg | Bin 104963 -> 0 bytes .../1-tools-browser-extensions/jsonview.png | Bin 4660 -> 0 bytes .../pageinsight.png | Bin 16574 -> 0 bytes .../webdeveloper.png | Bin 6700 -> 0 bytes 9-tools/2-fiddler/article.md | 99 - 9-tools/2-fiddler/fiddler-hook.png | Bin 2350 -> 0 bytes 9-tools/2-fiddler/fiddler.png | Bin 19388 -> 0 bytes 9-tools/3-ie-http-analyzer/article.md | 43 - .../3-ie-http-analyzer/ie-http-analyzer-2.gif | Bin 99077 -> 0 bytes .../3-ie-http-analyzer/ie-http-analyzer-3.gif | Bin 157 -> 0 bytes .../3-ie-http-analyzer/ie-http-analyzer.gif | Bin 29433 -> 0 bytes 9-tools/index.md | 2 - archive/1-class-property/article.md | 104 - archive/2-request-with-auth/solution.md | 1 - archive/2-request-with-auth/task.md | 15 - .../3-jquery-stub/1-jquery-intro/article.md | 47 - .../3-jquery-stub/2-jquery-search/article.md | 295 -- .../1-select-parents-with-self/solution.md | 6 - .../1-select-parents-with-self/task.md | 21 - .../3-jquery-traversal/article.md | 461 --- archive/3-jquery-stub/4-jquery-dom/article.md | 46 - .../1-rewrite-with-jquery/solution.md | 0 .../solution.view/bagua.css | 55 - .../solution.view/index.html | 83 - .../source.view/bagua.css | 55 - .../source.view/index.html | 96 - .../1-rewrite-with-jquery/task.md | 6 - .../5-jquery-stub-article/article.md | 3 - archive/3-jquery-stub/index.md | 3 - archive/3-reflow/article.md | 4 - archive/3-reflow/reflow.view/index.html | 494 --- archive/4-script-place-optimize/article.md | 64 - archive/menu.html | 76 - archive/upload-2way.view/index.html | 48 - archive/upload-2way.view/server.js | 110 - archive/upload-2way.view/uploader.js | 84 - .../widget-tasks/1-date-selector/solution.md | 0 .../solution.view/dateselector.js | 104 - .../1-date-selector/solution.view/index.html | 60 - .../source.view/dateselector.js | 12 - .../1-date-selector/source.view/index.html | 40 - archive/widget-tasks/1-date-selector/task.md | 46 - .../1-tooltip-over-element/solution.md | 81 - .../solution.view/index.html | 112 - .../source.view/index.html | 51 - .../1-tooltip-over-element/task.md | 32 - .../tooltip-fixed-center.png | Bin 1880 -> 0 bytes .../tooltip-fixed-center2.png | Bin 2087 -> 0 bytes .../2-draggable-windows/index.html | 47 - .../2-draggable-windows/solution.md | 10 - .../solution.view/draggableWindow.js | 127 - .../solution.view/index.html | 47 - .../solution.view/window.css | 52 - .../source.view/index.html | 52 - .../widget-tasks/2-draggable-windows/task.md | 25 - .../widget-tasks/2-moving-tooltip/solution.md | 31 - .../2-moving-tooltip/solution.view/index.html | 142 - .../2-moving-tooltip/source.view/index.html | 56 - archive/widget-tasks/2-moving-tooltip/task.md | 34 - archive/widget-tasks/3-resize-img/solution.md | 75 - .../3-resize-img/solution.view/index.html | 158 - .../3-resize-img/source.view/index.html | 32 - archive/widget-tasks/3-resize-img/task.md | 28 - .../widget-tasks/3-window-manager/solution.md | 1 - .../solution.view/draggableWindow.js | 145 - .../3-window-manager/solution.view/index.html | 51 - .../3-window-manager/solution.view/window.css | 52 - .../solution.view/windowManager.js | 52 - archive/widget-tasks/3-window-manager/task.md | 35 - .../4-double-calendar-with-arrows/solution.md | 3 - .../solution.view/calendar.css | 28 - .../solution.view/calendar.js | 161 - .../solution.view/datepicker.css | 41 - .../solution.view/datepicker.js | 133 - .../solution.view/index.html | 55 - .../source.view/calendar.css | 28 - .../source.view/calendar.js | 161 - .../source.view/datepicker.css | 1 - .../source.view/datepicker.js | 8 - .../source.view/index.html | 43 - .../4-double-calendar-with-arrows/task.md | 47 - .../4-img-select-mouse/solution.md | 21 - .../solution.view/index.html | 138 - .../4-img-select-mouse/source.view/index.html | 36 - .../widget-tasks/4-img-select-mouse/task.md | 31 - .../widget-tasks/5-menu-animated/solution.md | 0 .../5-menu-animated/solution.view/index.html | 115 - .../5-menu-animated/source.view/index.html | 76 - archive/widget-tasks/5-menu-animated/task.md | 25 - .../5-tree-checkboxes/solution.md | 75 - .../5-tree-checkboxes/solution.view/fetch.js | 25 - .../solution.view/index.html | 71 - .../solution.view/regions.js | 2365 --------------- .../5-tree-checkboxes/solution.view/tree.css | 36 - .../5-tree-checkboxes/solution.view/tree.js | 73 - .../5-tree-checkboxes/source.view/index.html | 2656 ----------------- .../widget-tasks/5-tree-checkboxes/task.md | 33 - archive/widget-tasks/7-calendar/solution.md | 0 .../7-calendar/solution.view/calendar.css | 28 - .../7-calendar/solution.view/calendar.js | 156 - .../7-calendar/solution.view/index.html | 37 - .../7-calendar/source.view/calendar-table.js | 58 - .../7-calendar/source.view/calendar.css | 28 - .../7-calendar/source.view/calendar.js | 10 - .../7-calendar/source.view/index.html | 37 - archive/widget-tasks/7-calendar/task.md | 46 - .../widget-tasks/8-autocomplete/solution.md | 0 .../solution.view/autocomplete-list.js | 62 - .../solution.view/autocomplete.css | 45 - .../solution.view/autocomplete.js | 104 - .../solution.view/filtering-list-provider.js | 20 - .../8-autocomplete/solution.view/index.html | 47 - archive/widget-tasks/8-autocomplete/task.md | 36 - .../9-hover-menu-onclick/solution.md | 0 .../solution.view/hoverintent.js | 62 - .../solution.view/index.html | 61 - .../solution.view/menu.css | 52 - .../solution.view/menu.js | 131 - .../widget-tasks/9-hover-menu-onclick/task.md | 12 - archive/widget-tasks/article.md | 2 - 1655 files changed, 847 insertions(+), 89231 deletions(-) delete mode 100644 1-js/10-es-modern/1-es-modern-usage/article.md delete mode 100644 1-js/10-es-modern/10-set-map/article.md delete mode 100644 1-js/10-es-modern/11-promise/1-promise-settimeout/solution.md delete mode 100644 1-js/10-es-modern/11-promise/1-promise-settimeout/task.md delete mode 100644 1-js/10-es-modern/11-promise/2-promise-sequence/solution.md delete mode 100644 1-js/10-es-modern/11-promise/2-promise-sequence/solution.view/guest.json delete mode 100644 1-js/10-es-modern/11-promise/2-promise-sequence/solution.view/httpGet.js delete mode 100644 1-js/10-es-modern/11-promise/2-promise-sequence/solution.view/index.html delete mode 100644 1-js/10-es-modern/11-promise/2-promise-sequence/solution.view/user.json delete mode 100644 1-js/10-es-modern/11-promise/2-promise-sequence/source.view/guest.json delete mode 100644 1-js/10-es-modern/11-promise/2-promise-sequence/source.view/httpGet.js delete mode 100644 1-js/10-es-modern/11-promise/2-promise-sequence/source.view/index.html delete mode 100644 1-js/10-es-modern/11-promise/2-promise-sequence/source.view/user.json delete mode 100644 1-js/10-es-modern/11-promise/2-promise-sequence/task.md delete mode 100644 1-js/10-es-modern/11-promise/anon.png delete mode 100644 1-js/10-es-modern/11-promise/article.md delete mode 100644 1-js/10-es-modern/11-promise/guest.json delete mode 100644 1-js/10-es-modern/11-promise/promiseEcma.png delete mode 100644 1-js/10-es-modern/11-promise/promiseEcma@2x.png delete mode 100644 1-js/10-es-modern/11-promise/promiseHandlerVariants.png delete mode 100644 1-js/10-es-modern/11-promise/promiseHandlerVariants@2x.png delete mode 100644 1-js/10-es-modern/11-promise/promiseInit.png delete mode 100644 1-js/10-es-modern/11-promise/promiseInit@2x.png delete mode 100644 1-js/10-es-modern/11-promise/promiseLoadAvatarChain-1.png delete mode 100644 1-js/10-es-modern/11-promise/promiseLoadAvatarChain-1@2x.png delete mode 100644 1-js/10-es-modern/11-promise/promiseLoadAvatarChain-2.png delete mode 100644 1-js/10-es-modern/11-promise/promiseLoadAvatarChain-2@2x.png delete mode 100644 1-js/10-es-modern/11-promise/promiseLoadAvatarChain-3.png delete mode 100644 1-js/10-es-modern/11-promise/promiseLoadAvatarChain-3@2x.png delete mode 100644 1-js/10-es-modern/11-promise/promiseLoadAvatarChain-4.png delete mode 100644 1-js/10-es-modern/11-promise/promiseLoadAvatarChain-4@2x.png delete mode 100644 1-js/10-es-modern/11-promise/promiseLoadAvatarChain.png delete mode 100644 1-js/10-es-modern/11-promise/promiseLoadAvatarChain@2x.png delete mode 100644 1-js/10-es-modern/11-promise/promiseTwo.png delete mode 100644 1-js/10-es-modern/11-promise/promiseTwo@2x.png delete mode 100644 1-js/10-es-modern/11-promise/promiseTwoThen.png delete mode 100644 1-js/10-es-modern/11-promise/promiseTwoThen@2x.png delete mode 100644 1-js/10-es-modern/11-promise/promiseUserFlow.png delete mode 100644 1-js/10-es-modern/11-promise/promiseUserFlow@2x.png delete mode 100644 1-js/10-es-modern/11-promise/user.json delete mode 100644 1-js/10-es-modern/11-promise/userNoGithub.json delete mode 100644 1-js/10-es-modern/12-generator/anon.png delete mode 100644 1-js/10-es-modern/12-generator/article.md delete mode 100644 1-js/10-es-modern/12-generator/genYield2-2.png delete mode 100644 1-js/10-es-modern/12-generator/genYield2-2@2x.png delete mode 100644 1-js/10-es-modern/12-generator/genYield2-3.png delete mode 100644 1-js/10-es-modern/12-generator/genYield2-3@2x.png delete mode 100644 1-js/10-es-modern/12-generator/genYield2.png delete mode 100644 1-js/10-es-modern/12-generator/genYield2@2x.png delete mode 100644 1-js/10-es-modern/12-generator/generateSequence-1.png delete mode 100644 1-js/10-es-modern/12-generator/generateSequence-1@2x.png delete mode 100644 1-js/10-es-modern/12-generator/generateSequence-2.png delete mode 100644 1-js/10-es-modern/12-generator/generateSequence-2@2x.png delete mode 100644 1-js/10-es-modern/12-generator/generateSequence-3.png delete mode 100644 1-js/10-es-modern/12-generator/generateSequence-3@2x.png delete mode 100644 1-js/10-es-modern/12-generator/generateSequence-4.png delete mode 100644 1-js/10-es-modern/12-generator/generateSequence-4@2x.png delete mode 100644 1-js/10-es-modern/12-generator/user.json delete mode 100644 1-js/10-es-modern/2-let-const/article.md delete mode 100644 1-js/10-es-modern/3-destructuring/article.md delete mode 100644 1-js/10-es-modern/4-es-function/article.md delete mode 100644 1-js/10-es-modern/5-es-string/article.md delete mode 100644 1-js/10-es-modern/6-es-object/article.md delete mode 100644 1-js/10-es-modern/7-es-class/article.md delete mode 100644 1-js/10-es-modern/8-symbol/article.md delete mode 100644 1-js/10-es-modern/9-iterator/article.md delete mode 100644 1-js/10-es-modern/index.md rename 1-js/2-first-steps/{11-uibasic => 10-uibasic}/1-simple-page/solution.md (100%) rename 1-js/2-first-steps/{11-uibasic => 10-uibasic}/1-simple-page/task.md (100%) rename 1-js/2-first-steps/{11-uibasic => 10-uibasic}/article.md (62%) create mode 100644 1-js/2-first-steps/2-external-script/banner.js delete mode 100644 1-js/5-functions-closures/1-global-object/1-window-and-variable/solution.md delete mode 100644 1-js/5-functions-closures/1-global-object/1-window-and-variable/task.md delete mode 100644 1-js/5-functions-closures/1-global-object/2-window-and-variable-2/solution.md delete mode 100644 1-js/5-functions-closures/1-global-object/2-window-and-variable-2/task.md delete mode 100644 1-js/5-functions-closures/1-global-object/3-window-and-variable-3/solution.md delete mode 100644 1-js/5-functions-closures/1-global-object/3-window-and-variable-3/task.md delete mode 100644 1-js/5-functions-closures/1-global-object/article.md delete mode 100644 1-js/5-functions-closures/2-closures/1-say-phrase-first/solution.md delete mode 100644 1-js/5-functions-closures/2-closures/1-say-phrase-first/task.md delete mode 100644 1-js/5-functions-closures/2-closures/2-which-value-is-modified/solution.md delete mode 100644 1-js/5-functions-closures/2-closures/2-which-value-is-modified/task.md delete mode 100644 1-js/5-functions-closures/2-closures/3-var-window/solution.md delete mode 100644 1-js/5-functions-closures/2-closures/3-var-window/task.md delete mode 100644 1-js/5-functions-closures/2-closures/4-call-inplace/solution.md delete mode 100644 1-js/5-functions-closures/2-closures/4-call-inplace/task.md delete mode 100644 1-js/5-functions-closures/2-closures/5-access-outer-variable/solution.md delete mode 100644 1-js/5-functions-closures/2-closures/5-access-outer-variable/task.md delete mode 100644 1-js/5-functions-closures/2-closures/6-counter-window-variable/solution.md delete mode 100644 1-js/5-functions-closures/2-closures/6-counter-window-variable/task.md delete mode 100755 1-js/5-functions-closures/2-closures/6@2x.png delete mode 100644 1-js/5-functions-closures/2-closures/article.md delete mode 100644 1-js/5-functions-closures/3-scope-new-function/article.md delete mode 100644 1-js/5-functions-closures/4-closures-usage/1-closure-sum/solution.md delete mode 100644 1-js/5-functions-closures/4-closures-usage/1-closure-sum/task.md delete mode 100644 1-js/5-functions-closures/4-closures-usage/2-stringbuffer/_js.view/solution.js delete mode 100644 1-js/5-functions-closures/4-closures-usage/2-stringbuffer/_js.view/test.js delete mode 100644 1-js/5-functions-closures/4-closures-usage/2-stringbuffer/solution.md delete mode 100644 1-js/5-functions-closures/4-closures-usage/2-stringbuffer/task.md delete mode 100644 1-js/5-functions-closures/4-closures-usage/3-stringbuffer-with-clear/_js.view/solution.js delete mode 100644 1-js/5-functions-closures/4-closures-usage/3-stringbuffer-with-clear/_js.view/test.js delete mode 100644 1-js/5-functions-closures/4-closures-usage/3-stringbuffer-with-clear/solution.md delete mode 100644 1-js/5-functions-closures/4-closures-usage/3-stringbuffer-with-clear/task.md delete mode 100644 1-js/5-functions-closures/4-closures-usage/4-sort-by-field/solution.md delete mode 100644 1-js/5-functions-closures/4-closures-usage/4-sort-by-field/task.md delete mode 100644 1-js/5-functions-closures/4-closures-usage/5-filter-through-function/_js.view/solution.js delete mode 100644 1-js/5-functions-closures/4-closures-usage/5-filter-through-function/_js.view/source.js delete mode 100644 1-js/5-functions-closures/4-closures-usage/5-filter-through-function/_js.view/test.js delete mode 100644 1-js/5-functions-closures/4-closures-usage/5-filter-through-function/solution.md delete mode 100644 1-js/5-functions-closures/4-closures-usage/5-filter-through-function/task.md delete mode 100644 1-js/5-functions-closures/4-closures-usage/6-make-army/_js.view/solution.js delete mode 100644 1-js/5-functions-closures/4-closures-usage/6-make-army/_js.view/source.js delete mode 100644 1-js/5-functions-closures/4-closures-usage/6-make-army/_js.view/test.js delete mode 100644 1-js/5-functions-closures/4-closures-usage/6-make-army/solution.md delete mode 100644 1-js/5-functions-closures/4-closures-usage/6-make-army/task.md delete mode 100644 1-js/5-functions-closures/4-closures-usage/article.md delete mode 100644 1-js/5-functions-closures/5-closures-module/article.md delete mode 100755 1-js/5-functions-closures/5-closures-module/hello-conflict.view/hello.js delete mode 100755 1-js/5-functions-closures/5-closures-module/hello-conflict.view/index.html delete mode 100755 1-js/5-functions-closures/5-closures-module/hello-module.view/hello.js delete mode 100755 1-js/5-functions-closures/5-closures-module/hello-module.view/index.html delete mode 100644 1-js/5-functions-closures/6-memory-management/article.md delete mode 100644 1-js/5-functions-closures/6-memory-management/family-no-family.png delete mode 100644 1-js/5-functions-closures/6-memory-management/family-no-family@2x.png delete mode 100644 1-js/5-functions-closures/6-memory-management/family-no-father-2.png delete mode 100644 1-js/5-functions-closures/6-memory-management/family-no-father-2@2x.png delete mode 100644 1-js/5-functions-closures/6-memory-management/family-no-father.png delete mode 100644 1-js/5-functions-closures/6-memory-management/family-no-father@2x.png delete mode 100644 1-js/5-functions-closures/6-memory-management/family.png delete mode 100644 1-js/5-functions-closures/6-memory-management/family@2x.png delete mode 100644 1-js/5-functions-closures/7-with/1-with-function/solution.md delete mode 100644 1-js/5-functions-closures/7-with/1-with-function/task.md delete mode 100644 1-js/5-functions-closures/7-with/2-with-variables/solution.md delete mode 100644 1-js/5-functions-closures/7-with/2-with-variables/task.md delete mode 100644 1-js/5-functions-closures/7-with/article.md delete mode 100644 1-js/5-functions-closures/index.md delete mode 100644 1-js/6-objects-more/1-object-methods/1-call-array-this/solution.md delete mode 100644 1-js/6-objects-more/1-object-methods/1-call-array-this/task.md delete mode 100644 1-js/6-objects-more/1-object-methods/2-check-syntax/solution.md delete mode 100644 1-js/6-objects-more/1-object-methods/2-check-syntax/task.md delete mode 100644 1-js/6-objects-more/1-object-methods/3-why-this/solution.md delete mode 100644 1-js/6-objects-more/1-object-methods/3-why-this/task.md delete mode 100644 1-js/6-objects-more/1-object-methods/4-object-property-this/solution.md delete mode 100644 1-js/6-objects-more/1-object-methods/4-object-property-this/task.md delete mode 100644 1-js/6-objects-more/1-object-methods/5-return-this/solution.md delete mode 100644 1-js/6-objects-more/1-object-methods/5-return-this/task.md delete mode 100644 1-js/6-objects-more/1-object-methods/6-return-object-this/solution.md delete mode 100644 1-js/6-objects-more/1-object-methods/6-return-object-this/task.md delete mode 100644 1-js/6-objects-more/1-object-methods/7-calculator/_js.view/solution.js delete mode 100644 1-js/6-objects-more/1-object-methods/7-calculator/_js.view/test.js delete mode 100644 1-js/6-objects-more/1-object-methods/7-calculator/solution.md delete mode 100644 1-js/6-objects-more/1-object-methods/7-calculator/task.md delete mode 100644 1-js/6-objects-more/1-object-methods/8-chain-calls/solution.md delete mode 100644 1-js/6-objects-more/1-object-methods/8-chain-calls/task.md delete mode 100644 1-js/6-objects-more/1-object-methods/article.md delete mode 100644 1-js/6-objects-more/2-object-conversion/1-array-equals-string/solution.md delete mode 100644 1-js/6-objects-more/2-object-conversion/1-array-equals-string/task.md delete mode 100644 1-js/6-objects-more/2-object-conversion/2-tostring-valueof/solution.md delete mode 100644 1-js/6-objects-more/2-object-conversion/2-tostring-valueof/task.md delete mode 100644 1-js/6-objects-more/2-object-conversion/3-compare-empty-arrays/solution.md delete mode 100644 1-js/6-objects-more/2-object-conversion/3-compare-empty-arrays/task.md delete mode 100644 1-js/6-objects-more/2-object-conversion/4-object-types-conversion-questions/solution.md delete mode 100644 1-js/6-objects-more/2-object-conversion/4-object-types-conversion-questions/task.md delete mode 100644 1-js/6-objects-more/2-object-conversion/5-sum-many-brackets/solution.md delete mode 100644 1-js/6-objects-more/2-object-conversion/5-sum-many-brackets/task.md delete mode 100644 1-js/6-objects-more/2-object-conversion/article.md delete mode 100644 1-js/6-objects-more/3-constructor-new/1-two-functions-one-object/solution.md delete mode 100644 1-js/6-objects-more/3-constructor-new/1-two-functions-one-object/task.md delete mode 100644 1-js/6-objects-more/3-constructor-new/2-calculator-constructor/_js.view/solution.js delete mode 100644 1-js/6-objects-more/3-constructor-new/2-calculator-constructor/_js.view/test.js delete mode 100644 1-js/6-objects-more/3-constructor-new/2-calculator-constructor/solution.md delete mode 100644 1-js/6-objects-more/3-constructor-new/2-calculator-constructor/task.md delete mode 100644 1-js/6-objects-more/3-constructor-new/3-accumulator/_js.view/solution.js delete mode 100644 1-js/6-objects-more/3-constructor-new/3-accumulator/_js.view/test.js delete mode 100644 1-js/6-objects-more/3-constructor-new/3-accumulator/solution.md delete mode 100644 1-js/6-objects-more/3-constructor-new/3-accumulator/task.md delete mode 100644 1-js/6-objects-more/3-constructor-new/4-calculator-extendable/_js.view/solution.js delete mode 100644 1-js/6-objects-more/3-constructor-new/4-calculator-extendable/_js.view/test.js delete mode 100644 1-js/6-objects-more/3-constructor-new/4-calculator-extendable/solution.md delete mode 100644 1-js/6-objects-more/3-constructor-new/4-calculator-extendable/task.md delete mode 100644 1-js/6-objects-more/3-constructor-new/article.md delete mode 100644 1-js/6-objects-more/4-descriptors-getters-setters/1-replace-property-getter/solution.md delete mode 100644 1-js/6-objects-more/4-descriptors-getters-setters/1-replace-property-getter/task.md delete mode 100644 1-js/6-objects-more/4-descriptors-getters-setters/article.md delete mode 100644 1-js/6-objects-more/5-static-properties-and-methods/1-objects-counter/_js.view/solution.js delete mode 100644 1-js/6-objects-more/5-static-properties-and-methods/1-objects-counter/_js.view/test.js delete mode 100644 1-js/6-objects-more/5-static-properties-and-methods/1-objects-counter/solution.md delete mode 100644 1-js/6-objects-more/5-static-properties-and-methods/1-objects-counter/task.md delete mode 100644 1-js/6-objects-more/5-static-properties-and-methods/article.md delete mode 100644 1-js/6-objects-more/6-call-apply/1-rewrite-sum-arguments/solution.md delete mode 100644 1-js/6-objects-more/6-call-apply/1-rewrite-sum-arguments/task.md delete mode 100644 1-js/6-objects-more/6-call-apply/2-apply-function-skip-first-argument/_js.view/solution.js delete mode 100644 1-js/6-objects-more/6-call-apply/2-apply-function-skip-first-argument/_js.view/test.js delete mode 100644 1-js/6-objects-more/6-call-apply/2-apply-function-skip-first-argument/solution.md delete mode 100644 1-js/6-objects-more/6-call-apply/2-apply-function-skip-first-argument/task.md delete mode 100644 1-js/6-objects-more/6-call-apply/article.md delete mode 100644 1-js/6-objects-more/7-bind/1-cross-browser-bind/solution.md delete mode 100644 1-js/6-objects-more/7-bind/1-cross-browser-bind/task.md delete mode 100644 1-js/6-objects-more/7-bind/2-write-to-object-after-bind/solution.md delete mode 100644 1-js/6-objects-more/7-bind/2-write-to-object-after-bind/task.md delete mode 100644 1-js/6-objects-more/7-bind/3-second-bind/solution.md delete mode 100644 1-js/6-objects-more/7-bind/3-second-bind/task.md delete mode 100644 1-js/6-objects-more/7-bind/4-function-property-after-bind/solution.md delete mode 100644 1-js/6-objects-more/7-bind/4-function-property-after-bind/task.md delete mode 100644 1-js/6-objects-more/7-bind/5-question-use-bind/solution.md delete mode 100644 1-js/6-objects-more/7-bind/5-question-use-bind/task.md delete mode 100644 1-js/6-objects-more/7-bind/6-ask-currying/solution.md delete mode 100644 1-js/6-objects-more/7-bind/6-ask-currying/task.md delete mode 100644 1-js/6-objects-more/7-bind/article.md delete mode 100644 1-js/6-objects-more/8-decorators/1-logging-decorator/_js.view/solution.js delete mode 100644 1-js/6-objects-more/8-decorators/1-logging-decorator/_js.view/test.js delete mode 100644 1-js/6-objects-more/8-decorators/1-logging-decorator/solution.md delete mode 100644 1-js/6-objects-more/8-decorators/1-logging-decorator/task.md delete mode 100644 1-js/6-objects-more/8-decorators/2-logging-decorator-arguments/_js.view/solution.js delete mode 100644 1-js/6-objects-more/8-decorators/2-logging-decorator-arguments/_js.view/test.js delete mode 100644 1-js/6-objects-more/8-decorators/2-logging-decorator-arguments/solution.md delete mode 100644 1-js/6-objects-more/8-decorators/2-logging-decorator-arguments/task.md delete mode 100644 1-js/6-objects-more/8-decorators/3-caching-decorator/_js.view/solution.js delete mode 100644 1-js/6-objects-more/8-decorators/3-caching-decorator/_js.view/test.js delete mode 100644 1-js/6-objects-more/8-decorators/3-caching-decorator/solution.md delete mode 100644 1-js/6-objects-more/8-decorators/3-caching-decorator/task.md delete mode 100644 1-js/6-objects-more/8-decorators/article.md delete mode 100644 1-js/6-objects-more/index.md delete mode 100644 1-js/7-js-misc/1-class-instanceof/1-format-date-polymorphic/_js.view/solution.js delete mode 100644 1-js/7-js-misc/1-class-instanceof/1-format-date-polymorphic/_js.view/test.js delete mode 100644 1-js/7-js-misc/1-class-instanceof/1-format-date-polymorphic/solution.md delete mode 100644 1-js/7-js-misc/1-class-instanceof/1-format-date-polymorphic/task.md delete mode 100644 1-js/7-js-misc/1-class-instanceof/article.md delete mode 100644 1-js/7-js-misc/2-json/1-serialize-object/solution.md delete mode 100644 1-js/7-js-misc/2-json/1-serialize-object/task.md delete mode 100644 1-js/7-js-misc/2-json/2-serialize-object-circular/solution.md delete mode 100644 1-js/7-js-misc/2-json/2-serialize-object-circular/task.md delete mode 100644 1-js/7-js-misc/2-json/article.md delete mode 100644 1-js/7-js-misc/3-settimeout-setinterval/1-output-numbers-100ms/solution.md delete mode 100644 1-js/7-js-misc/3-settimeout-setinterval/1-output-numbers-100ms/task.md delete mode 100644 1-js/7-js-misc/3-settimeout-setinterval/2-output-numbers-100ms-settimeout/solution.md delete mode 100644 1-js/7-js-misc/3-settimeout-setinterval/2-output-numbers-100ms-settimeout/task.md delete mode 100644 1-js/7-js-misc/3-settimeout-setinterval/3-highlight-tactics/solution.md delete mode 100644 1-js/7-js-misc/3-settimeout-setinterval/3-highlight-tactics/task.md delete mode 100644 1-js/7-js-misc/3-settimeout-setinterval/4-settimeout-result/solution.md delete mode 100644 1-js/7-js-misc/3-settimeout-setinterval/4-settimeout-result/task.md delete mode 100644 1-js/7-js-misc/3-settimeout-setinterval/5-setinterval-result/solution.md delete mode 100644 1-js/7-js-misc/3-settimeout-setinterval/5-setinterval-result/task.md delete mode 100644 1-js/7-js-misc/3-settimeout-setinterval/6-who-runs-faster/solution.md delete mode 100644 1-js/7-js-misc/3-settimeout-setinterval/6-who-runs-faster/task.md delete mode 100644 1-js/7-js-misc/3-settimeout-setinterval/7-delay/_js.view/solution.js delete mode 100644 1-js/7-js-misc/3-settimeout-setinterval/7-delay/_js.view/test.js delete mode 100644 1-js/7-js-misc/3-settimeout-setinterval/7-delay/solution.md delete mode 100644 1-js/7-js-misc/3-settimeout-setinterval/7-delay/task.md delete mode 100644 1-js/7-js-misc/3-settimeout-setinterval/8-debounce/_js.view/solution.js delete mode 100644 1-js/7-js-misc/3-settimeout-setinterval/8-debounce/_js.view/test.js delete mode 100644 1-js/7-js-misc/3-settimeout-setinterval/8-debounce/solution.md delete mode 100644 1-js/7-js-misc/3-settimeout-setinterval/8-debounce/task.md delete mode 100644 1-js/7-js-misc/3-settimeout-setinterval/9-throttle/_js.view/solution.js delete mode 100644 1-js/7-js-misc/3-settimeout-setinterval/9-throttle/_js.view/test.js delete mode 100644 1-js/7-js-misc/3-settimeout-setinterval/9-throttle/solution.md delete mode 100644 1-js/7-js-misc/3-settimeout-setinterval/9-throttle/task.md delete mode 100644 1-js/7-js-misc/3-settimeout-setinterval/article.md delete mode 100644 1-js/7-js-misc/3-settimeout-setinterval/setinterval-anim.view/index.html delete mode 100644 1-js/7-js-misc/3-settimeout-setinterval/setinterval-interval.png delete mode 100644 1-js/7-js-misc/3-settimeout-setinterval/setinterval-interval@2x.png delete mode 100644 1-js/7-js-misc/3-settimeout-setinterval/settimeout-interval.png delete mode 100644 1-js/7-js-misc/3-settimeout-setinterval/settimeout-interval@2x.png delete mode 100644 1-js/7-js-misc/4-eval/1-eval-calculator/solution.md delete mode 100644 1-js/7-js-misc/4-eval/1-eval-calculator/task.md delete mode 100644 1-js/7-js-misc/4-eval/article.md delete mode 100644 1-js/7-js-misc/5-exception/1-finally-or-code-after/solution.md delete mode 100644 1-js/7-js-misc/5-exception/1-finally-or-code-after/task.md delete mode 100644 1-js/7-js-misc/5-exception/2-eval-calculator-errors/solution.md delete mode 100644 1-js/7-js-misc/5-exception/2-eval-calculator-errors/task.md delete mode 100644 1-js/7-js-misc/5-exception/article.md delete mode 100644 1-js/7-js-misc/index.md delete mode 100644 1-js/8-oop/1-about-oop/article.md delete mode 100644 1-js/8-oop/2-internal-external-interface/1-add-method-property-coffeemachine/solution.md delete mode 100644 1-js/8-oop/2-internal-external-interface/1-add-method-property-coffeemachine/task.md delete mode 100644 1-js/8-oop/2-internal-external-interface/article.md delete mode 100755 1-js/8-oop/2-internal-external-interface/coffee-inside.jpg delete mode 100755 1-js/8-oop/2-internal-external-interface/coffee.jpg delete mode 100644 1-js/8-oop/3-getters-setters/1-object-with-getters-setters/solution.md delete mode 100644 1-js/8-oop/3-getters-setters/1-object-with-getters-setters/task.md delete mode 100644 1-js/8-oop/3-getters-setters/2-getter-power/solution.md delete mode 100644 1-js/8-oop/3-getters-setters/2-getter-power/task.md delete mode 100644 1-js/8-oop/3-getters-setters/3-add-public-coffeemachine/solution.md delete mode 100644 1-js/8-oop/3-getters-setters/3-add-public-coffeemachine/task.md delete mode 100644 1-js/8-oop/3-getters-setters/4-setter-onready/solution.md delete mode 100644 1-js/8-oop/3-getters-setters/4-setter-onready/task.md delete mode 100644 1-js/8-oop/3-getters-setters/5-coffeemachine-add-isrunning/solution.md delete mode 100644 1-js/8-oop/3-getters-setters/5-coffeemachine-add-isrunning/task.md delete mode 100644 1-js/8-oop/3-getters-setters/article.md delete mode 100644 1-js/8-oop/5-functional-inheritance/1-coffeemachine-fix-run/solution.md delete mode 100755 1-js/8-oop/5-functional-inheritance/1-coffeemachine-fix-run/solution.view/index.html delete mode 100755 1-js/8-oop/5-functional-inheritance/1-coffeemachine-fix-run/source.view/index.html delete mode 100644 1-js/8-oop/5-functional-inheritance/1-coffeemachine-fix-run/task.md delete mode 100644 1-js/8-oop/5-functional-inheritance/2-coffeemachine-disable-stop/solution.md delete mode 100755 1-js/8-oop/5-functional-inheritance/2-coffeemachine-disable-stop/solution.view/index.html delete mode 100644 1-js/8-oop/5-functional-inheritance/2-coffeemachine-disable-stop/task.md delete mode 100644 1-js/8-oop/5-functional-inheritance/3-inherit-fridge/solution.md delete mode 100644 1-js/8-oop/5-functional-inheritance/3-inherit-fridge/task.md delete mode 100644 1-js/8-oop/5-functional-inheritance/4-add-methods-fridge/solution.md delete mode 100644 1-js/8-oop/5-functional-inheritance/4-add-methods-fridge/task.md delete mode 100644 1-js/8-oop/5-functional-inheritance/5-override-disable/solution.md delete mode 100644 1-js/8-oop/5-functional-inheritance/5-override-disable/task.md delete mode 100644 1-js/8-oop/5-functional-inheritance/article.md delete mode 100644 1-js/8-oop/index.md delete mode 100644 1-js/9-prototypes/1-prototype/1-property-after-delete/solution.md delete mode 100644 1-js/9-prototypes/1-prototype/1-property-after-delete/task.md delete mode 100755 1-js/9-prototypes/1-prototype/2-proto-and-this/proto5.png delete mode 100755 1-js/9-prototypes/1-prototype/2-proto-and-this/proto6.png delete mode 100644 1-js/9-prototypes/1-prototype/2-proto-and-this/solution.md delete mode 100644 1-js/9-prototypes/1-prototype/2-proto-and-this/task.md delete mode 100644 1-js/9-prototypes/1-prototype/3-search-algorithm/solution.md delete mode 100644 1-js/9-prototypes/1-prototype/3-search-algorithm/task.md delete mode 100644 1-js/9-prototypes/1-prototype/article.md delete mode 100644 1-js/9-prototypes/1-prototype/proto-animal-rabbit.png delete mode 100644 1-js/9-prototypes/1-prototype/proto-animal-rabbit@2x.png delete mode 100644 1-js/9-prototypes/2-new-prototype/1-prototype-after-new/solution.md delete mode 100644 1-js/9-prototypes/2-new-prototype/1-prototype-after-new/task.md delete mode 100644 1-js/9-prototypes/2-new-prototype/2-default-arguments/solution.md delete mode 100644 1-js/9-prototypes/2-new-prototype/2-default-arguments/task.md delete mode 100644 1-js/9-prototypes/2-new-prototype/3-compare-calls/solution.md delete mode 100644 1-js/9-prototypes/2-new-prototype/3-compare-calls/task.md delete mode 100644 1-js/9-prototypes/2-new-prototype/4-new-object-same-constructor/solution.md delete mode 100644 1-js/9-prototypes/2-new-prototype/4-new-object-same-constructor/task.md delete mode 100644 1-js/9-prototypes/2-new-prototype/article.md delete mode 100644 1-js/9-prototypes/3-native-prototypes/1-defer-to-prototype/solution.md delete mode 100644 1-js/9-prototypes/3-native-prototypes/1-defer-to-prototype/task.md delete mode 100644 1-js/9-prototypes/3-native-prototypes/2-defer-to-prototype-extended/solution.md delete mode 100644 1-js/9-prototypes/3-native-prototypes/2-defer-to-prototype-extended/task.md delete mode 100644 1-js/9-prototypes/3-native-prototypes/article.md delete mode 100644 1-js/9-prototypes/3-native-prototypes/native-prototype-object.png delete mode 100644 1-js/9-prototypes/3-native-prototypes/native-prototypes-array-tostring.png delete mode 100644 1-js/9-prototypes/3-native-prototypes/native-prototypes-array-tostring@2x.png delete mode 100644 1-js/9-prototypes/3-native-prototypes/native-prototypes-classes.png delete mode 100644 1-js/9-prototypes/3-native-prototypes/native-prototypes-classes@2x.png delete mode 100644 1-js/9-prototypes/3-native-prototypes/native-prototypes-object.png delete mode 100644 1-js/9-prototypes/3-native-prototypes/native-prototypes-object@2x.png delete mode 100644 1-js/9-prototypes/4-classes/1-rewrite-by-class/solution.md delete mode 100644 1-js/9-prototypes/4-classes/1-rewrite-by-class/task.md delete mode 100644 1-js/9-prototypes/4-classes/2-hamsters-with-proto/solution.md delete mode 100644 1-js/9-prototypes/4-classes/2-hamsters-with-proto/task.md delete mode 100644 1-js/9-prototypes/4-classes/article.md delete mode 100644 1-js/9-prototypes/5-class-inheritance/1-inheritance-error-assign/solution.md delete mode 100644 1-js/9-prototypes/5-class-inheritance/1-inheritance-error-assign/task.md delete mode 100644 1-js/9-prototypes/5-class-inheritance/2-inheritance-error-constructor/solution.md delete mode 100644 1-js/9-prototypes/5-class-inheritance/2-inheritance-error-constructor/task.md delete mode 100755 1-js/9-prototypes/5-class-inheritance/3-clock-class/clock.js delete mode 100644 1-js/9-prototypes/5-class-inheritance/3-clock-class/solution.md delete mode 100755 1-js/9-prototypes/5-class-inheritance/3-clock-class/solution.view/clock.js delete mode 100755 1-js/9-prototypes/5-class-inheritance/3-clock-class/solution.view/index.html delete mode 100755 1-js/9-prototypes/5-class-inheritance/3-clock-class/source.view/clock.js delete mode 100755 1-js/9-prototypes/5-class-inheritance/3-clock-class/source.view/index.html delete mode 100644 1-js/9-prototypes/5-class-inheritance/3-clock-class/task.md delete mode 100755 1-js/9-prototypes/5-class-inheritance/4-clock-class-extended/extended-clock.js delete mode 100644 1-js/9-prototypes/5-class-inheritance/4-clock-class-extended/solution.md delete mode 100755 1-js/9-prototypes/5-class-inheritance/4-clock-class-extended/solution.view/clock.js delete mode 100755 1-js/9-prototypes/5-class-inheritance/4-clock-class-extended/solution.view/extended-clock.js delete mode 100755 1-js/9-prototypes/5-class-inheritance/4-clock-class-extended/solution.view/index.html delete mode 100755 1-js/9-prototypes/5-class-inheritance/4-clock-class-extended/source.view/clock.js delete mode 100755 1-js/9-prototypes/5-class-inheritance/4-clock-class-extended/source.view/extended-clock.js delete mode 100755 1-js/9-prototypes/5-class-inheritance/4-clock-class-extended/source.view/index.html delete mode 100644 1-js/9-prototypes/5-class-inheritance/4-clock-class-extended/task.md delete mode 100644 1-js/9-prototypes/5-class-inheritance/5-menu-timer-animated/solution.md delete mode 100755 1-js/9-prototypes/5-class-inheritance/5-menu-timer-animated/solution.view/index.html delete mode 100755 1-js/9-prototypes/5-class-inheritance/5-menu-timer-animated/solution.view/menu.js delete mode 100755 1-js/9-prototypes/5-class-inheritance/5-menu-timer-animated/source.view/index.html delete mode 100755 1-js/9-prototypes/5-class-inheritance/5-menu-timer-animated/source.view/menu.js delete mode 100644 1-js/9-prototypes/5-class-inheritance/5-menu-timer-animated/task.md delete mode 100644 1-js/9-prototypes/5-class-inheritance/6-constructor-inherited/solution.md delete mode 100644 1-js/9-prototypes/5-class-inheritance/6-constructor-inherited/task.md delete mode 100644 1-js/9-prototypes/5-class-inheritance/article.md delete mode 100644 1-js/9-prototypes/5-class-inheritance/class-inheritance-array-object.png delete mode 100644 1-js/9-prototypes/5-class-inheritance/class-inheritance-array-object@2x.png delete mode 100644 1-js/9-prototypes/5-class-inheritance/class-inheritance-rabbit-animal.png delete mode 100644 1-js/9-prototypes/5-class-inheritance/class-inheritance-rabbit-animal@2x.png delete mode 100644 1-js/9-prototypes/5-class-inheritance/class-inheritance-rabbit-run-animal.png delete mode 100644 1-js/9-prototypes/5-class-inheritance/class-inheritance-rabbit-run-animal@2x.png delete mode 100755 1-js/9-prototypes/5-class-inheritance/console_dir_array.png delete mode 100755 1-js/9-prototypes/5-class-inheritance/console_dir_array@2x.png delete mode 100644 1-js/9-prototypes/6-instanceof/1-strange-instanceof/solution.md delete mode 100644 1-js/9-prototypes/6-instanceof/1-strange-instanceof/task.md delete mode 100644 1-js/9-prototypes/6-instanceof/2-instanceof-result/solution.md delete mode 100644 1-js/9-prototypes/6-instanceof/2-instanceof-result/task.md delete mode 100644 1-js/9-prototypes/6-instanceof/article.md delete mode 100644 1-js/9-prototypes/7-oop-errors/1-format-error/solution.md delete mode 100644 1-js/9-prototypes/7-oop-errors/1-format-error/task.md delete mode 100644 1-js/9-prototypes/7-oop-errors/article.md delete mode 100644 1-js/9-prototypes/8-mixins/article.md delete mode 100644 1-js/9-prototypes/index.md delete mode 100644 10-regular-expressions-javascript/1-regexp-introduction/article.md delete mode 100644 10-regular-expressions-javascript/10-regexp-ahchors/1-start-end/solution.md delete mode 100644 10-regular-expressions-javascript/10-regexp-ahchors/1-start-end/task.md delete mode 100644 10-regular-expressions-javascript/10-regexp-ahchors/2-test-mac/solution.md delete mode 100644 10-regular-expressions-javascript/10-regexp-ahchors/2-test-mac/task.md delete mode 100644 10-regular-expressions-javascript/10-regexp-ahchors/article.md delete mode 100644 10-regular-expressions-javascript/11-regexp-multiline-mode/article.md delete mode 100644 10-regular-expressions-javascript/12-regexp-lookahead/article.md delete mode 100644 10-regular-expressions-javascript/13-regexp-infinite-backtracking-problem/article.md delete mode 100644 10-regular-expressions-javascript/13-regexp-infinite-backtracking-problem/bad_backtrack_greedy1.png delete mode 100644 10-regular-expressions-javascript/13-regexp-infinite-backtracking-problem/bad_backtrack_greedy11.png delete mode 100644 10-regular-expressions-javascript/13-regexp-infinite-backtracking-problem/bad_backtrack_greedy2.png delete mode 100644 10-regular-expressions-javascript/13-regexp-infinite-backtracking-problem/bad_backtrack_greedy3.png delete mode 100644 10-regular-expressions-javascript/13-regexp-infinite-backtracking-problem/bad_backtrack_greedy4.png delete mode 100644 10-regular-expressions-javascript/13-regexp-infinite-backtracking-problem/bad_backtrack_greedy5.png delete mode 100644 10-regular-expressions-javascript/2-regexp-methods/article.md delete mode 100644 10-regular-expressions-javascript/3-regexp-character-classes/1-find-time-hh-mm/solution.md delete mode 100644 10-regular-expressions-javascript/3-regexp-character-classes/1-find-time-hh-mm/task.md delete mode 100644 10-regular-expressions-javascript/3-regexp-character-classes/article.md delete mode 100644 10-regular-expressions-javascript/3-regexp-character-classes/hello-java-boundaries.png delete mode 100644 10-regular-expressions-javascript/3-regexp-character-classes/hello-java-boundaries@2x.png delete mode 100644 10-regular-expressions-javascript/3-regexp-character-classes/love-html5-classes.png delete mode 100644 10-regular-expressions-javascript/3-regexp-character-classes/love-html5-classes@2x.png delete mode 100644 10-regular-expressions-javascript/4-regexp-character-sets-and-ranges/1-find-range-1/solution.md delete mode 100644 10-regular-expressions-javascript/4-regexp-character-sets-and-ranges/1-find-range-1/task.md delete mode 100644 10-regular-expressions-javascript/4-regexp-character-sets-and-ranges/2-find-time-2-formats/solution.md delete mode 100644 10-regular-expressions-javascript/4-regexp-character-sets-and-ranges/2-find-time-2-formats/task.md delete mode 100644 10-regular-expressions-javascript/4-regexp-character-sets-and-ranges/article.md delete mode 100644 10-regular-expressions-javascript/5-regexp-quantifiers/1-find-text-manydots/solution.md delete mode 100644 10-regular-expressions-javascript/5-regexp-quantifiers/1-find-text-manydots/task.md delete mode 100644 10-regular-expressions-javascript/5-regexp-quantifiers/2-find-html-colors-6hex/solution.md delete mode 100644 10-regular-expressions-javascript/5-regexp-quantifiers/2-find-html-colors-6hex/task.md delete mode 100644 10-regular-expressions-javascript/5-regexp-quantifiers/3-find-decimal-positive-numbers/solution.md delete mode 100644 10-regular-expressions-javascript/5-regexp-quantifiers/3-find-decimal-positive-numbers/task.md delete mode 100644 10-regular-expressions-javascript/5-regexp-quantifiers/4-find-decimal-numbers/solution.md delete mode 100644 10-regular-expressions-javascript/5-regexp-quantifiers/4-find-decimal-numbers/task.md delete mode 100644 10-regular-expressions-javascript/5-regexp-quantifiers/article.md delete mode 100644 10-regular-expressions-javascript/6-regexp-greedy-and-lazy/1-lazy-greedy/solution.md delete mode 100644 10-regular-expressions-javascript/6-regexp-greedy-and-lazy/1-lazy-greedy/task.md delete mode 100644 10-regular-expressions-javascript/6-regexp-greedy-and-lazy/2-difference-find-quote/solution.md delete mode 100644 10-regular-expressions-javascript/6-regexp-greedy-and-lazy/2-difference-find-quote/task.md delete mode 100644 10-regular-expressions-javascript/6-regexp-greedy-and-lazy/3-find-html-comments/solution.md delete mode 100644 10-regular-expressions-javascript/6-regexp-greedy-and-lazy/3-find-html-comments/task.md delete mode 100644 10-regular-expressions-javascript/6-regexp-greedy-and-lazy/4-find-html-tags-greedy-lazy/solution.md delete mode 100644 10-regular-expressions-javascript/6-regexp-greedy-and-lazy/4-find-html-tags-greedy-lazy/task.md delete mode 100644 10-regular-expressions-javascript/6-regexp-greedy-and-lazy/article.md delete mode 100644 10-regular-expressions-javascript/6-regexp-greedy-and-lazy/witch_greedy1.png delete mode 100644 10-regular-expressions-javascript/6-regexp-greedy-and-lazy/witch_greedy1@2x.png delete mode 100644 10-regular-expressions-javascript/6-regexp-greedy-and-lazy/witch_greedy2.png delete mode 100644 10-regular-expressions-javascript/6-regexp-greedy-and-lazy/witch_greedy2@2x.png delete mode 100644 10-regular-expressions-javascript/6-regexp-greedy-and-lazy/witch_greedy3.png delete mode 100644 10-regular-expressions-javascript/6-regexp-greedy-and-lazy/witch_greedy3@2x.png delete mode 100644 10-regular-expressions-javascript/6-regexp-greedy-and-lazy/witch_greedy4.png delete mode 100644 10-regular-expressions-javascript/6-regexp-greedy-and-lazy/witch_greedy4@2x.png delete mode 100644 10-regular-expressions-javascript/6-regexp-greedy-and-lazy/witch_greedy5.png delete mode 100644 10-regular-expressions-javascript/6-regexp-greedy-and-lazy/witch_greedy5@2x.png delete mode 100644 10-regular-expressions-javascript/6-regexp-greedy-and-lazy/witch_greedy6.png delete mode 100644 10-regular-expressions-javascript/6-regexp-greedy-and-lazy/witch_greedy6@2x.png delete mode 100644 10-regular-expressions-javascript/6-regexp-greedy-and-lazy/witch_lazy3.png delete mode 100644 10-regular-expressions-javascript/6-regexp-greedy-and-lazy/witch_lazy3@2x.png delete mode 100644 10-regular-expressions-javascript/6-regexp-greedy-and-lazy/witch_lazy4.png delete mode 100644 10-regular-expressions-javascript/6-regexp-greedy-and-lazy/witch_lazy4@2x.png delete mode 100644 10-regular-expressions-javascript/6-regexp-greedy-and-lazy/witch_lazy5.png delete mode 100644 10-regular-expressions-javascript/6-regexp-greedy-and-lazy/witch_lazy5@2x.png delete mode 100644 10-regular-expressions-javascript/6-regexp-greedy-and-lazy/witch_lazy6.png delete mode 100644 10-regular-expressions-javascript/6-regexp-greedy-and-lazy/witch_lazy6@2x.png delete mode 100644 10-regular-expressions-javascript/7-regexp-groups/1-find-webcolor-3-or-6/solution.md delete mode 100644 10-regular-expressions-javascript/7-regexp-groups/1-find-webcolor-3-or-6/task.md delete mode 100644 10-regular-expressions-javascript/7-regexp-groups/2-parse-expression/solution.md delete mode 100644 10-regular-expressions-javascript/7-regexp-groups/2-parse-expression/task.md delete mode 100644 10-regular-expressions-javascript/7-regexp-groups/article.md delete mode 100644 10-regular-expressions-javascript/7-regexp-groups/regexp-nested-groups.png delete mode 100644 10-regular-expressions-javascript/7-regexp-groups/regexp-nested-groups@2x.png delete mode 100644 10-regular-expressions-javascript/8-regexp-backreferences/1-find-matching-bbtags/solution.md delete mode 100644 10-regular-expressions-javascript/8-regexp-backreferences/1-find-matching-bbtags/task.md delete mode 100644 10-regular-expressions-javascript/8-regexp-backreferences/article.md delete mode 100644 10-regular-expressions-javascript/9-regexp-alternation/1-find-programming-language/solution.md delete mode 100644 10-regular-expressions-javascript/9-regexp-alternation/1-find-programming-language/task.md delete mode 100644 10-regular-expressions-javascript/9-regexp-alternation/2-match-quoted-string/solution.md delete mode 100644 10-regular-expressions-javascript/9-regexp-alternation/2-match-quoted-string/task.md delete mode 100644 10-regular-expressions-javascript/9-regexp-alternation/3-match-exact-tag/solution.md delete mode 100644 10-regular-expressions-javascript/9-regexp-alternation/3-match-exact-tag/task.md delete mode 100644 10-regular-expressions-javascript/9-regexp-alternation/article.md delete mode 100644 10-regular-expressions-javascript/index.md delete mode 100644 11-extra/10-cookie/article.md delete mode 100644 11-extra/10-cookie/cookie.js delete mode 100644 11-extra/10-cookie/safari-nocookie.png delete mode 100644 11-extra/10-cookie/safari-nocookie@2x.png delete mode 100644 11-extra/11-intl/1-collate-array-sort/solution.md delete mode 100644 11-extra/11-intl/1-collate-array-sort/task.md delete mode 100644 11-extra/11-intl/article.md delete mode 100644 11-extra/12-regexp-specials/article.md delete mode 100644 11-extra/3-templates/article.md delete mode 100644 11-extra/4-books/article.md delete mode 100644 11-extra/5-setimmediate/article.md delete mode 100644 11-extra/5-setimmediate/setimmediate.view/index.html delete mode 100644 11-extra/5-setimmediate/setimmediate.view/setImmediate.js delete mode 100644 11-extra/6-bind-late/article.md delete mode 100644 11-extra/7-sublime/article.md delete mode 100644 11-extra/7-sublime/sheet.pdf delete mode 100644 11-extra/8-range-textrange-selection/56.gif delete mode 100644 11-extra/8-range-textrange-selection/57.gif delete mode 100644 11-extra/8-range-textrange-selection/58.gif delete mode 100644 11-extra/8-range-textrange-selection/article.md delete mode 100644 11-extra/8-range-textrange-selection/domRangeCreate.view/index.html delete mode 100644 11-extra/8-range-textrange-selection/domRangeHighlight.view/index.html delete mode 100644 11-extra/8-range-textrange-selection/fix-ie.view/fixIERangeObject.js delete mode 100644 11-extra/8-range-textrange-selection/fix-ie.view/index.html delete mode 100644 11-extra/8-range-textrange-selection/ieTextRangeHighlight.view/index.html delete mode 100644 11-extra/8-range-textrange-selection/setSelection.view/index.html delete mode 100644 11-extra/9-drag-and-drop-plus/DragAvatar.js delete mode 100644 11-extra/9-drag-and-drop-plus/DragManager.js delete mode 100644 11-extra/9-drag-and-drop-plus/DragZone.js delete mode 100644 11-extra/9-drag-and-drop-plus/DropTarget.js delete mode 100644 11-extra/9-drag-and-drop-plus/TreeDragAvatar.js delete mode 100644 11-extra/9-drag-and-drop-plus/TreeDragZone.js delete mode 100644 11-extra/9-drag-and-drop-plus/TreeDropTarget.js delete mode 100644 11-extra/9-drag-and-drop-plus/article.md delete mode 100644 11-extra/9-drag-and-drop-plus/dragTree.view/DragAvatar.js delete mode 100644 11-extra/9-drag-and-drop-plus/dragTree.view/DragManager.js delete mode 100644 11-extra/9-drag-and-drop-plus/dragTree.view/DragZone.js delete mode 100644 11-extra/9-drag-and-drop-plus/dragTree.view/DropTarget.js delete mode 100644 11-extra/9-drag-and-drop-plus/dragTree.view/TreeDragAvatar.js delete mode 100644 11-extra/9-drag-and-drop-plus/dragTree.view/TreeDragZone.js delete mode 100644 11-extra/9-drag-and-drop-plus/dragTree.view/TreeDropTarget.js delete mode 100644 11-extra/9-drag-and-drop-plus/dragTree.view/dragTree.css delete mode 100644 11-extra/9-drag-and-drop-plus/dragTree.view/index.html delete mode 100644 11-extra/9-drag-and-drop-plus/dragTree.view/lib.js delete mode 100644 11-extra/9-drag-and-drop-plus/dragzonetarget.png delete mode 100644 11-extra/index.md delete mode 100644 2-ui/1-document/1-browser-environment/article.md delete mode 100644 2-ui/1-document/1-browser-environment/windowObjects.png delete mode 100644 2-ui/1-document/1-browser-environment/windowObjects@2x.png delete mode 100644 2-ui/1-document/10-compare-document-position/article.md delete mode 100644 2-ui/1-document/11-modifying-document/1-createtextnode-vs-innerhtml/solution.md delete mode 100644 2-ui/1-document/11-modifying-document/1-createtextnode-vs-innerhtml/task.md delete mode 100644 2-ui/1-document/11-modifying-document/10-clock-setinterval/solution.md delete mode 100644 2-ui/1-document/11-modifying-document/10-clock-setinterval/solution.view/index.html delete mode 100644 2-ui/1-document/11-modifying-document/10-clock-setinterval/source.view/index.html delete mode 100644 2-ui/1-document/11-modifying-document/10-clock-setinterval/task.md delete mode 100644 2-ui/1-document/11-modifying-document/2-remove-polyfill/solution.md delete mode 100644 2-ui/1-document/11-modifying-document/2-remove-polyfill/task.md delete mode 100644 2-ui/1-document/11-modifying-document/3-insert-after/solution.md delete mode 100644 2-ui/1-document/11-modifying-document/3-insert-after/task.md delete mode 100644 2-ui/1-document/11-modifying-document/4-remove-children/solution.md delete mode 100644 2-ui/1-document/11-modifying-document/4-remove-children/task.md delete mode 100644 2-ui/1-document/11-modifying-document/5-why-aaa/solution.md delete mode 100644 2-ui/1-document/11-modifying-document/5-why-aaa/task.md delete mode 100644 2-ui/1-document/11-modifying-document/6-create-list/solution.md delete mode 100755 2-ui/1-document/11-modifying-document/6-create-list/solution.view/index.html delete mode 100644 2-ui/1-document/11-modifying-document/6-create-list/task.md delete mode 100755 2-ui/1-document/11-modifying-document/7-create-object-tree/build-tree-dom.view/index.html delete mode 100644 2-ui/1-document/11-modifying-document/7-create-object-tree/solution.md delete mode 100755 2-ui/1-document/11-modifying-document/7-create-object-tree/solution.view/index.html delete mode 100755 2-ui/1-document/11-modifying-document/7-create-object-tree/source.view/index.html delete mode 100644 2-ui/1-document/11-modifying-document/7-create-object-tree/task.md delete mode 100644 2-ui/1-document/11-modifying-document/8-tree-count/solution.md delete mode 100644 2-ui/1-document/11-modifying-document/8-tree-count/solution.view/index.html delete mode 100644 2-ui/1-document/11-modifying-document/8-tree-count/source.view/index.html delete mode 100644 2-ui/1-document/11-modifying-document/8-tree-count/task.md delete mode 100644 2-ui/1-document/11-modifying-document/9-calendar-table/solution.md delete mode 100644 2-ui/1-document/11-modifying-document/9-calendar-table/solution.view/index.html delete mode 100644 2-ui/1-document/11-modifying-document/9-calendar-table/source.view/index.html delete mode 100644 2-ui/1-document/11-modifying-document/9-calendar-table/task.md delete mode 100644 2-ui/1-document/11-modifying-document/article.md delete mode 100644 2-ui/1-document/12-multi-insert/1-append-to-list/solution.md delete mode 100644 2-ui/1-document/12-multi-insert/1-append-to-list/task.md delete mode 100644 2-ui/1-document/12-multi-insert/2-sort-table-performance/solution.md delete mode 100644 2-ui/1-document/12-multi-insert/2-sort-table-performance/solution.view/index.html delete mode 100644 2-ui/1-document/12-multi-insert/2-sort-table-performance/task.md delete mode 100644 2-ui/1-document/12-multi-insert/article.md delete mode 100644 2-ui/1-document/12-multi-insert/benchmark.view/bench.js delete mode 100644 2-ui/1-document/12-multi-insert/benchmark.view/documentfragment-bench.js delete mode 100644 2-ui/1-document/12-multi-insert/benchmark.view/index.html delete mode 100755 2-ui/1-document/12-multi-insert/documentfragment-bench.js delete mode 100755 2-ui/1-document/12-multi-insert/insert-bench.js delete mode 100644 2-ui/1-document/12-multi-insert/insertAdjacentFF.js delete mode 100755 2-ui/1-document/12-multi-insert/insertAdjacentHTML.png delete mode 100644 2-ui/1-document/13-document-write/article.md delete mode 100644 2-ui/1-document/14-styles-and-classes/1-round-button-javascript/solution.md delete mode 100755 2-ui/1-document/14-styles-and-classes/1-round-button-javascript/solution.view/index.html delete mode 100755 2-ui/1-document/14-styles-and-classes/1-round-button-javascript/source.view/index.html delete mode 100644 2-ui/1-document/14-styles-and-classes/1-round-button-javascript/task.md delete mode 100644 2-ui/1-document/14-styles-and-classes/2-create-notification/solution.md delete mode 100755 2-ui/1-document/14-styles-and-classes/2-create-notification/solution.view/index.css delete mode 100755 2-ui/1-document/14-styles-and-classes/2-create-notification/solution.view/index.html delete mode 100755 2-ui/1-document/14-styles-and-classes/2-create-notification/source.view/index.css delete mode 100755 2-ui/1-document/14-styles-and-classes/2-create-notification/source.view/index.html delete mode 100644 2-ui/1-document/14-styles-and-classes/2-create-notification/task.md delete mode 100644 2-ui/1-document/14-styles-and-classes/article.md delete mode 100644 2-ui/1-document/14-styles-and-classes/getiecomputedstyle.view/getiecomputedstyle.js delete mode 100644 2-ui/1-document/14-styles-and-classes/getiecomputedstyle.view/index.html delete mode 100644 2-ui/1-document/15-metrics/1-get-scroll-height-bottom/solution.md delete mode 100644 2-ui/1-document/15-metrics/1-get-scroll-height-bottom/task.md delete mode 100644 2-ui/1-document/15-metrics/2-scrollbar-width/solution.md delete mode 100644 2-ui/1-document/15-metrics/2-scrollbar-width/task.md delete mode 100644 2-ui/1-document/15-metrics/3-div-placeholder/solution.md delete mode 100755 2-ui/1-document/15-metrics/3-div-placeholder/solution.view/index.html delete mode 100755 2-ui/1-document/15-metrics/3-div-placeholder/source.view/index.html delete mode 100644 2-ui/1-document/15-metrics/3-div-placeholder/task.md delete mode 100755 2-ui/1-document/15-metrics/4-put-ball-in-center/ball-half/index.html delete mode 100755 2-ui/1-document/15-metrics/4-put-ball-in-center/field.png delete mode 100644 2-ui/1-document/15-metrics/4-put-ball-in-center/solution.md delete mode 100755 2-ui/1-document/15-metrics/4-put-ball-in-center/solution.view/index.html delete mode 100755 2-ui/1-document/15-metrics/4-put-ball-in-center/source.view/index.html delete mode 100644 2-ui/1-document/15-metrics/4-put-ball-in-center/task.md delete mode 100644 2-ui/1-document/15-metrics/5-expand-element/solution.md delete mode 100755 2-ui/1-document/15-metrics/5-expand-element/solution.view/index.html delete mode 100755 2-ui/1-document/15-metrics/5-expand-element/source.view/index.html delete mode 100644 2-ui/1-document/15-metrics/5-expand-element/task.md delete mode 100644 2-ui/1-document/15-metrics/6-width-vs-clientwidth/solution.md delete mode 100644 2-ui/1-document/15-metrics/6-width-vs-clientwidth/task.md delete mode 100644 2-ui/1-document/15-metrics/article.md delete mode 100755 2-ui/1-document/15-metrics/cssWidthScroll.view/index.html delete mode 100644 2-ui/1-document/15-metrics/metric-all.png delete mode 100644 2-ui/1-document/15-metrics/metric-all@2x.png delete mode 100644 2-ui/1-document/15-metrics/metric-client-left-top-rtl.png delete mode 100644 2-ui/1-document/15-metrics/metric-client-left-top-rtl@2x.png delete mode 100644 2-ui/1-document/15-metrics/metric-client-left-top.png delete mode 100644 2-ui/1-document/15-metrics/metric-client-left-top@2x.png delete mode 100644 2-ui/1-document/15-metrics/metric-client-width-height.png delete mode 100644 2-ui/1-document/15-metrics/metric-client-width-height@2x.png delete mode 100644 2-ui/1-document/15-metrics/metric-client-width-nopadding.png delete mode 100644 2-ui/1-document/15-metrics/metric-client-width-nopadding@2x.png delete mode 100644 2-ui/1-document/15-metrics/metric-css.png delete mode 100644 2-ui/1-document/15-metrics/metric-css@2x.png delete mode 100644 2-ui/1-document/15-metrics/metric-offset-parent.png delete mode 100644 2-ui/1-document/15-metrics/metric-offset-parent@2x.png delete mode 100644 2-ui/1-document/15-metrics/metric-offset-width-height.png delete mode 100644 2-ui/1-document/15-metrics/metric-offset-width-height@2x.png delete mode 100644 2-ui/1-document/15-metrics/metric-scroll-top.png delete mode 100644 2-ui/1-document/15-metrics/metric-scroll-top@2x.png delete mode 100644 2-ui/1-document/15-metrics/metric-scroll-width-height.png delete mode 100644 2-ui/1-document/15-metrics/metric-scroll-width-height@2x.png delete mode 100755 2-ui/1-document/15-metrics/metric.view/index.html delete mode 100644 2-ui/1-document/16-metrics-window/1-pageyoffset-polyfill/solution.md delete mode 100644 2-ui/1-document/16-metrics-window/1-pageyoffset-polyfill/task.md delete mode 100644 2-ui/1-document/16-metrics-window/article.md delete mode 100644 2-ui/1-document/16-metrics-window/document-client-width-height.png delete mode 100644 2-ui/1-document/16-metrics-window/document-client-width-height@2x.png delete mode 100644 2-ui/1-document/17-coordinates/1-find-point-coordinates/solution.md delete mode 100755 2-ui/1-document/17-coordinates/1-find-point-coordinates/solution.view/index.css delete mode 100755 2-ui/1-document/17-coordinates/1-find-point-coordinates/solution.view/index.html delete mode 100755 2-ui/1-document/17-coordinates/1-find-point-coordinates/source.view/index.css delete mode 100755 2-ui/1-document/17-coordinates/1-find-point-coordinates/source.view/index.html delete mode 100644 2-ui/1-document/17-coordinates/1-find-point-coordinates/task.md delete mode 100644 2-ui/1-document/17-coordinates/2-position-at/solution.md delete mode 100755 2-ui/1-document/17-coordinates/2-position-at/solution.view/index.css delete mode 100755 2-ui/1-document/17-coordinates/2-position-at/solution.view/index.html delete mode 100755 2-ui/1-document/17-coordinates/2-position-at/source.view/index.css delete mode 100755 2-ui/1-document/17-coordinates/2-position-at/source.view/index.html delete mode 100644 2-ui/1-document/17-coordinates/2-position-at/task.md delete mode 100644 2-ui/1-document/17-coordinates/article.md delete mode 100644 2-ui/1-document/17-coordinates/coords.png delete mode 100644 2-ui/1-document/17-coordinates/coords@2x.png delete mode 100644 2-ui/1-document/18-coordinates-document/1-get-document-scrolls/solution.md delete mode 100644 2-ui/1-document/18-coordinates-document/1-get-document-scrolls/task.md delete mode 100644 2-ui/1-document/18-coordinates-document/2-position-at-absolute/solution.md delete mode 100644 2-ui/1-document/18-coordinates-document/2-position-at-absolute/solution.view/index.css delete mode 100644 2-ui/1-document/18-coordinates-document/2-position-at-absolute/solution.view/index.html delete mode 100644 2-ui/1-document/18-coordinates-document/2-position-at-absolute/task.md delete mode 100644 2-ui/1-document/18-coordinates-document/3-position-at-2/solution.md delete mode 100644 2-ui/1-document/18-coordinates-document/3-position-at-2/solution.view/index.css delete mode 100644 2-ui/1-document/18-coordinates-document/3-position-at-2/solution.view/index.html delete mode 100644 2-ui/1-document/18-coordinates-document/3-position-at-2/task.md delete mode 100644 2-ui/1-document/18-coordinates-document/article.md delete mode 100755 2-ui/1-document/18-coordinates-document/getcoords-compare.png delete mode 100755 2-ui/1-document/18-coordinates-document/getcoords-compare@2x.png delete mode 100755 2-ui/1-document/18-coordinates-document/pagewindow0.png delete mode 100755 2-ui/1-document/18-coordinates-document/screen.png delete mode 100755 2-ui/1-document/18-coordinates-document/standards-scroll.png delete mode 100755 2-ui/1-document/18-coordinates-document/standards.png delete mode 100644 2-ui/1-document/19-dom-cheatsheet/article.md delete mode 100644 2-ui/1-document/2-dom-nodes/1-body-from-head/solution.md delete mode 100644 2-ui/1-document/2-dom-nodes/1-body-from-head/task.md delete mode 100644 2-ui/1-document/2-dom-nodes/article.md delete mode 100644 2-ui/1-document/3-dom-console/1.png delete mode 100755 2-ui/1-document/3-dom-console/1@2x.png delete mode 100644 2-ui/1-document/3-dom-console/2.png delete mode 100755 2-ui/1-document/3-dom-console/2@2x.png delete mode 100644 2-ui/1-document/3-dom-console/3.png delete mode 100755 2-ui/1-document/3-dom-console/3@2x.png delete mode 100644 2-ui/1-document/3-dom-console/article.md delete mode 100644 2-ui/1-document/3-dom-console/losi.html delete mode 100644 2-ui/1-document/4-traversing-dom/1-dom-children/solution.md delete mode 100644 2-ui/1-document/4-traversing-dom/1-dom-children/task.md delete mode 100644 2-ui/1-document/4-traversing-dom/2-has-childnodes/solution.md delete mode 100644 2-ui/1-document/4-traversing-dom/2-has-childnodes/task.md delete mode 100644 2-ui/1-document/4-traversing-dom/3-navigation-links-which-null/solution.md delete mode 100644 2-ui/1-document/4-traversing-dom/3-navigation-links-which-null/task.md delete mode 100644 2-ui/1-document/4-traversing-dom/4-select-diagonal-cells/solution.md delete mode 100644 2-ui/1-document/4-traversing-dom/4-select-diagonal-cells/solution.view/index.html delete mode 100644 2-ui/1-document/4-traversing-dom/4-select-diagonal-cells/source.view/index.html delete mode 100644 2-ui/1-document/4-traversing-dom/4-select-diagonal-cells/task.md delete mode 100644 2-ui/1-document/4-traversing-dom/article.md delete mode 100644 2-ui/1-document/4-traversing-dom/dom-links-elements.png delete mode 100644 2-ui/1-document/4-traversing-dom/dom-links-elements@2x.png delete mode 100644 2-ui/1-document/4-traversing-dom/dom-links.png delete mode 100644 2-ui/1-document/4-traversing-dom/dom-links@2x.png delete mode 100644 2-ui/1-document/4-traversing-dom/travel.view/index.html delete mode 100644 2-ui/1-document/5-searching-elements-dom/1-find-elements/solution.md delete mode 100644 2-ui/1-document/5-searching-elements-dom/1-find-elements/table.html delete mode 100644 2-ui/1-document/5-searching-elements-dom/1-find-elements/task.md delete mode 100644 2-ui/1-document/5-searching-elements-dom/2-tree-info/solution.md delete mode 100644 2-ui/1-document/5-searching-elements-dom/2-tree-info/solution.view/index.html delete mode 100644 2-ui/1-document/5-searching-elements-dom/2-tree-info/source.view/index.html delete mode 100644 2-ui/1-document/5-searching-elements-dom/2-tree-info/task.md delete mode 100644 2-ui/1-document/5-searching-elements-dom/article.md delete mode 100644 2-ui/1-document/6-searching-elements-internals/1-collection-length-after-remove/solution.md delete mode 100644 2-ui/1-document/6-searching-elements-internals/1-collection-length-after-remove/task.md delete mode 100644 2-ui/1-document/6-searching-elements-internals/2-compare-elements-count/solution.md delete mode 100644 2-ui/1-document/6-searching-elements-internals/2-compare-elements-count/task.md delete mode 100644 2-ui/1-document/6-searching-elements-internals/3-benchmark-search-dom/solution.md delete mode 100644 2-ui/1-document/6-searching-elements-internals/3-benchmark-search-dom/solution.view/index.html delete mode 100644 2-ui/1-document/6-searching-elements-internals/3-benchmark-search-dom/source.view/index.html delete mode 100644 2-ui/1-document/6-searching-elements-internals/3-benchmark-search-dom/task.md delete mode 100644 2-ui/1-document/6-searching-elements-internals/4-get-second-li/solution.md delete mode 100644 2-ui/1-document/6-searching-elements-internals/4-get-second-li/task.md delete mode 100644 2-ui/1-document/6-searching-elements-internals/article.md delete mode 100644 2-ui/1-document/7-basic-dom-node-properties/1-console-firstchild-innerhtml/console-innerhtml.png delete mode 100644 2-ui/1-document/7-basic-dom-node-properties/1-console-firstchild-innerhtml/console-innerhtml@2x.png delete mode 100644 2-ui/1-document/7-basic-dom-node-properties/1-console-firstchild-innerhtml/solution.md delete mode 100644 2-ui/1-document/7-basic-dom-node-properties/1-console-firstchild-innerhtml/task.md delete mode 100644 2-ui/1-document/7-basic-dom-node-properties/2-lastchild-nodetype-inline/solution.md delete mode 100644 2-ui/1-document/7-basic-dom-node-properties/2-lastchild-nodetype-inline/task.md delete mode 100644 2-ui/1-document/7-basic-dom-node-properties/3-tag-in-comment/solution.md delete mode 100644 2-ui/1-document/7-basic-dom-node-properties/3-tag-in-comment/task.md delete mode 100644 2-ui/1-document/7-basic-dom-node-properties/4-where-document-in-hierarchy/solution.md delete mode 100644 2-ui/1-document/7-basic-dom-node-properties/4-where-document-in-hierarchy/task.md delete mode 100644 2-ui/1-document/7-basic-dom-node-properties/article.md delete mode 100644 2-ui/1-document/7-basic-dom-node-properties/hierarchy.png delete mode 100644 2-ui/1-document/8-dom-polyfill/1-polyfill-matches/solution.md delete mode 100644 2-ui/1-document/8-dom-polyfill/1-polyfill-matches/task.md delete mode 100644 2-ui/1-document/8-dom-polyfill/2-polyfill-closest/solution.md delete mode 100644 2-ui/1-document/8-dom-polyfill/2-polyfill-closest/task.md delete mode 100644 2-ui/1-document/8-dom-polyfill/3-polyfill-textcontent-ie8/solution.md delete mode 100644 2-ui/1-document/8-dom-polyfill/3-polyfill-textcontent-ie8/task.md delete mode 100644 2-ui/1-document/8-dom-polyfill/article.md delete mode 100644 2-ui/1-document/9-attributes-and-custom-properties/1-get-user-attribute/solution.md delete mode 100644 2-ui/1-document/9-attributes-and-custom-properties/1-get-user-attribute/solution.view/index.html delete mode 100644 2-ui/1-document/9-attributes-and-custom-properties/1-get-user-attribute/task.md delete mode 100644 2-ui/1-document/9-attributes-and-custom-properties/2-set-class-links/solution.md delete mode 100644 2-ui/1-document/9-attributes-and-custom-properties/2-set-class-links/solution.view/index.html delete mode 100644 2-ui/1-document/9-attributes-and-custom-properties/2-set-class-links/task.md delete mode 100644 2-ui/1-document/9-attributes-and-custom-properties/article.md delete mode 100644 2-ui/1-document/index.md delete mode 100644 2-ui/2-events-and-interfaces/1-introduction-browser-events/1-hide-other/solution.md delete mode 100755 2-ui/2-events-and-interfaces/1-introduction-browser-events/1-hide-other/solution.view/index.html delete mode 100755 2-ui/2-events-and-interfaces/1-introduction-browser-events/1-hide-other/source.view/index.html delete mode 100644 2-ui/2-events-and-interfaces/1-introduction-browser-events/1-hide-other/task.md delete mode 100644 2-ui/2-events-and-interfaces/1-introduction-browser-events/2-hide-self-onclick/solution.md delete mode 100644 2-ui/2-events-and-interfaces/1-introduction-browser-events/2-hide-self-onclick/task.md delete mode 100644 2-ui/2-events-and-interfaces/1-introduction-browser-events/3-which-handlers-run/solution.md delete mode 100644 2-ui/2-events-and-interfaces/1-introduction-browser-events/3-which-handlers-run/task.md delete mode 100644 2-ui/2-events-and-interfaces/1-introduction-browser-events/4-sliding-menu/solution.md delete mode 100755 2-ui/2-events-and-interfaces/1-introduction-browser-events/4-sliding-menu/solution.view/index.html delete mode 100755 2-ui/2-events-and-interfaces/1-introduction-browser-events/4-sliding-menu/source.view/index.html delete mode 100644 2-ui/2-events-and-interfaces/1-introduction-browser-events/4-sliding-menu/task.md delete mode 100644 2-ui/2-events-and-interfaces/1-introduction-browser-events/5-hide-message/solution.md delete mode 100755 2-ui/2-events-and-interfaces/1-introduction-browser-events/5-hide-message/solution.view/index.html delete mode 100755 2-ui/2-events-and-interfaces/1-introduction-browser-events/5-hide-message/solution.view/messages.css delete mode 100755 2-ui/2-events-and-interfaces/1-introduction-browser-events/5-hide-message/source.view/index.html delete mode 100755 2-ui/2-events-and-interfaces/1-introduction-browser-events/5-hide-message/source.view/messages.css delete mode 100644 2-ui/2-events-and-interfaces/1-introduction-browser-events/5-hide-message/task.md delete mode 100644 2-ui/2-events-and-interfaces/1-introduction-browser-events/6-carousel/carousel1.png delete mode 100644 2-ui/2-events-and-interfaces/1-introduction-browser-events/6-carousel/carousel1@2x.png delete mode 100644 2-ui/2-events-and-interfaces/1-introduction-browser-events/6-carousel/carousel2.png delete mode 100644 2-ui/2-events-and-interfaces/1-introduction-browser-events/6-carousel/carousel2@2x.png delete mode 100644 2-ui/2-events-and-interfaces/1-introduction-browser-events/6-carousel/solution.md delete mode 100755 2-ui/2-events-and-interfaces/1-introduction-browser-events/6-carousel/solution.view/index.html delete mode 100755 2-ui/2-events-and-interfaces/1-introduction-browser-events/6-carousel/solution.view/style.css delete mode 100755 2-ui/2-events-and-interfaces/1-introduction-browser-events/6-carousel/source.view/index.html delete mode 100644 2-ui/2-events-and-interfaces/1-introduction-browser-events/6-carousel/source.view/style.css delete mode 100644 2-ui/2-events-and-interfaces/1-introduction-browser-events/6-carousel/task.md delete mode 100644 2-ui/2-events-and-interfaces/1-introduction-browser-events/article.md delete mode 100644 2-ui/2-events-and-interfaces/2-events-and-timing-depth/article.md delete mode 100644 2-ui/2-events-and-interfaces/3-obtaining-event-object/1-move-ball-field/solution.md delete mode 100755 2-ui/2-events-and-interfaces/3-obtaining-event-object/1-move-ball-field/solution.view/index.html delete mode 100755 2-ui/2-events-and-interfaces/3-obtaining-event-object/1-move-ball-field/source.view/index.html delete mode 100644 2-ui/2-events-and-interfaces/3-obtaining-event-object/1-move-ball-field/task.md delete mode 100644 2-ui/2-events-and-interfaces/3-obtaining-event-object/article.md delete mode 100644 2-ui/2-events-and-interfaces/4-event-bubbling/article.md delete mode 100755 2-ui/2-events-and-interfaces/4-event-bubbling/both.view/example.css delete mode 100755 2-ui/2-events-and-interfaces/4-event-bubbling/both.view/index.html delete mode 100755 2-ui/2-events-and-interfaces/4-event-bubbling/both.view/script.js delete mode 100755 2-ui/2-events-and-interfaces/4-event-bubbling/bubble-target.view/example.css delete mode 100755 2-ui/2-events-and-interfaces/4-event-bubbling/bubble-target.view/index.html delete mode 100755 2-ui/2-events-and-interfaces/4-event-bubbling/bubble-target.view/script.js delete mode 100755 2-ui/2-events-and-interfaces/4-event-bubbling/capture.view/example.css delete mode 100755 2-ui/2-events-and-interfaces/4-event-bubbling/capture.view/index.html delete mode 100755 2-ui/2-events-and-interfaces/4-event-bubbling/capture.view/script.js delete mode 100644 2-ui/2-events-and-interfaces/4-event-bubbling/event-order-bubbling.png delete mode 100644 2-ui/2-events-and-interfaces/4-event-bubbling/event-order-bubbling@2x.png delete mode 100644 2-ui/2-events-and-interfaces/4-event-bubbling/eventflow.png delete mode 100644 2-ui/2-events-and-interfaces/4-event-bubbling/eventflow@2x.png delete mode 100644 2-ui/2-events-and-interfaces/5-event-delegation/1-hide-message-delegate/solution.md delete mode 100755 2-ui/2-events-and-interfaces/5-event-delegation/1-hide-message-delegate/solution.view/index.html delete mode 100755 2-ui/2-events-and-interfaces/5-event-delegation/1-hide-message-delegate/solution.view/messages.css delete mode 100755 2-ui/2-events-and-interfaces/5-event-delegation/1-hide-message-delegate/source.view/index.html delete mode 100755 2-ui/2-events-and-interfaces/5-event-delegation/1-hide-message-delegate/source.view/messages.css delete mode 100644 2-ui/2-events-and-interfaces/5-event-delegation/1-hide-message-delegate/task.md delete mode 100644 2-ui/2-events-and-interfaces/5-event-delegation/2-sliding-tree/solution.md delete mode 100755 2-ui/2-events-and-interfaces/5-event-delegation/2-sliding-tree/solution.view/index.html delete mode 100755 2-ui/2-events-and-interfaces/5-event-delegation/2-sliding-tree/source.view/index.html delete mode 100644 2-ui/2-events-and-interfaces/5-event-delegation/2-sliding-tree/task.md delete mode 100644 2-ui/2-events-and-interfaces/5-event-delegation/3-sort-table/solution.md delete mode 100755 2-ui/2-events-and-interfaces/5-event-delegation/3-sort-table/solution.view/index.html delete mode 100755 2-ui/2-events-and-interfaces/5-event-delegation/3-sort-table/source.view/index.html delete mode 100644 2-ui/2-events-and-interfaces/5-event-delegation/3-sort-table/task.md delete mode 100644 2-ui/2-events-and-interfaces/5-event-delegation/article.md delete mode 100644 2-ui/2-events-and-interfaces/5-event-delegation/bagua-bubble.png delete mode 100644 2-ui/2-events-and-interfaces/5-event-delegation/bagua-bubble@2x.png delete mode 100755 2-ui/2-events-and-interfaces/5-event-delegation/bagua.view/bagua.css delete mode 100755 2-ui/2-events-and-interfaces/5-event-delegation/bagua.view/index.html delete mode 100644 2-ui/2-events-and-interfaces/6-behavior/1-behavior-tooltip/solution.md delete mode 100644 2-ui/2-events-and-interfaces/6-behavior/1-behavior-tooltip/solution.view/index.html delete mode 100644 2-ui/2-events-and-interfaces/6-behavior/1-behavior-tooltip/source.view/index.html delete mode 100644 2-ui/2-events-and-interfaces/6-behavior/1-behavior-tooltip/task.md delete mode 100644 2-ui/2-events-and-interfaces/6-behavior/article.md delete mode 100644 2-ui/2-events-and-interfaces/7-default-browser-action/1-why-return-false-fails/solution.md delete mode 100644 2-ui/2-events-and-interfaces/7-default-browser-action/1-why-return-false-fails/task.md delete mode 100644 2-ui/2-events-and-interfaces/7-default-browser-action/2-catch-link-navigation/solution.md delete mode 100755 2-ui/2-events-and-interfaces/7-default-browser-action/2-catch-link-navigation/solution.view/index.html delete mode 100755 2-ui/2-events-and-interfaces/7-default-browser-action/2-catch-link-navigation/source.view/index.html delete mode 100644 2-ui/2-events-and-interfaces/7-default-browser-action/2-catch-link-navigation/task.md delete mode 100644 2-ui/2-events-and-interfaces/7-default-browser-action/3-image-gallery/solution.md delete mode 100755 2-ui/2-events-and-interfaces/7-default-browser-action/3-image-gallery/solution.view/gallery.css delete mode 100755 2-ui/2-events-and-interfaces/7-default-browser-action/3-image-gallery/solution.view/index.html delete mode 100755 2-ui/2-events-and-interfaces/7-default-browser-action/3-image-gallery/source.view/gallery.css delete mode 100755 2-ui/2-events-and-interfaces/7-default-browser-action/3-image-gallery/source.view/index.html delete mode 100644 2-ui/2-events-and-interfaces/7-default-browser-action/3-image-gallery/task.md delete mode 100644 2-ui/2-events-and-interfaces/7-default-browser-action/article.md delete mode 100755 2-ui/2-events-and-interfaces/7-default-browser-action/menu.view/index.html delete mode 100755 2-ui/2-events-and-interfaces/7-default-browser-action/menu.view/menu.css delete mode 100755 2-ui/2-events-and-interfaces/7-default-browser-action/menu.view/menu.js delete mode 100644 2-ui/2-events-and-interfaces/8-dispatch-events/article.md delete mode 100644 2-ui/2-events-and-interfaces/index.md delete mode 100644 2-ui/3-event-details/1-mouse-clicks/1-selectable-list/solution.md delete mode 100755 2-ui/3-event-details/1-mouse-clicks/1-selectable-list/solution.view/index.html delete mode 100755 2-ui/3-event-details/1-mouse-clicks/1-selectable-list/source.view/index.html delete mode 100644 2-ui/3-event-details/1-mouse-clicks/1-selectable-list/task.md delete mode 100644 2-ui/3-event-details/1-mouse-clicks/2-tree-coords/solution.md delete mode 100755 2-ui/3-event-details/1-mouse-clicks/2-tree-coords/solution.view/index.html delete mode 100755 2-ui/3-event-details/1-mouse-clicks/2-tree-coords/source.view/index.html delete mode 100644 2-ui/3-event-details/1-mouse-clicks/2-tree-coords/task.md delete mode 100644 2-ui/3-event-details/1-mouse-clicks/article.md delete mode 100644 2-ui/3-event-details/10-onload-ondomcontentloaded/article.md delete mode 100755 2-ui/3-event-details/10-onload-ondomcontentloaded/window-onbeforeunload.view/index.html delete mode 100644 2-ui/3-event-details/11-onload-onerror/1-nice-alt/solution.md delete mode 100755 2-ui/3-event-details/11-onload-onerror/1-nice-alt/solution.view/index.html delete mode 100755 2-ui/3-event-details/11-onload-onerror/1-nice-alt/source.view/index.html delete mode 100644 2-ui/3-event-details/11-onload-onerror/1-nice-alt/task.md delete mode 100644 2-ui/3-event-details/11-onload-onerror/2-load-img-callback/solution.md delete mode 100755 2-ui/3-event-details/11-onload-onerror/2-load-img-callback/solution.view/index.html delete mode 100755 2-ui/3-event-details/11-onload-onerror/2-load-img-callback/source.view/index.html delete mode 100644 2-ui/3-event-details/11-onload-onerror/2-load-img-callback/task.md delete mode 100644 2-ui/3-event-details/11-onload-onerror/3-script-callback/solution.md delete mode 100755 2-ui/3-event-details/11-onload-onerror/3-script-callback/solution.view/go.js delete mode 100755 2-ui/3-event-details/11-onload-onerror/3-script-callback/solution.view/index.html delete mode 100755 2-ui/3-event-details/11-onload-onerror/3-script-callback/source.view/go.js delete mode 100755 2-ui/3-event-details/11-onload-onerror/3-script-callback/source.view/index.html delete mode 100644 2-ui/3-event-details/11-onload-onerror/3-script-callback/task.md delete mode 100644 2-ui/3-event-details/11-onload-onerror/4-scripts-callback/solution.md delete mode 100755 2-ui/3-event-details/11-onload-onerror/4-scripts-callback/solution.view/a.js delete mode 100755 2-ui/3-event-details/11-onload-onerror/4-scripts-callback/solution.view/b.js delete mode 100755 2-ui/3-event-details/11-onload-onerror/4-scripts-callback/solution.view/c.js delete mode 100755 2-ui/3-event-details/11-onload-onerror/4-scripts-callback/solution.view/index.html delete mode 100755 2-ui/3-event-details/11-onload-onerror/4-scripts-callback/source.view/a.js delete mode 100755 2-ui/3-event-details/11-onload-onerror/4-scripts-callback/source.view/b.js delete mode 100755 2-ui/3-event-details/11-onload-onerror/4-scripts-callback/source.view/c.js delete mode 100755 2-ui/3-event-details/11-onload-onerror/4-scripts-callback/source.view/index.html delete mode 100644 2-ui/3-event-details/11-onload-onerror/4-scripts-callback/task.md delete mode 100644 2-ui/3-event-details/11-onload-onerror/article.md delete mode 100644 2-ui/3-event-details/2-unselectable/article.md delete mode 100644 2-ui/3-event-details/3-mousemove-mouseover-mouseout-mouseenter-mouseleave/1-behavior-nested-tooltip/solution.md delete mode 100644 2-ui/3-event-details/3-mousemove-mouseover-mouseout-mouseenter-mouseleave/1-behavior-nested-tooltip/solution.view/index.html delete mode 100644 2-ui/3-event-details/3-mousemove-mouseover-mouseout-mouseenter-mouseleave/1-behavior-nested-tooltip/source.view/index.html delete mode 100644 2-ui/3-event-details/3-mousemove-mouseover-mouseout-mouseenter-mouseleave/1-behavior-nested-tooltip/task.md delete mode 100644 2-ui/3-event-details/3-mousemove-mouseover-mouseout-mouseenter-mouseleave/2-hoverintent/solution.md delete mode 100644 2-ui/3-event-details/3-mousemove-mouseover-mouseout-mouseenter-mouseleave/2-hoverintent/solution.view/hoverIntent.js delete mode 100644 2-ui/3-event-details/3-mousemove-mouseover-mouseout-mouseenter-mouseleave/2-hoverintent/solution.view/index.html delete mode 100644 2-ui/3-event-details/3-mousemove-mouseover-mouseout-mouseenter-mouseleave/2-hoverintent/solution.view/style.css delete mode 100644 2-ui/3-event-details/3-mousemove-mouseover-mouseout-mouseenter-mouseleave/2-hoverintent/source.view/hoverIntent.js delete mode 100644 2-ui/3-event-details/3-mousemove-mouseover-mouseout-mouseenter-mouseleave/2-hoverintent/source.view/index.html delete mode 100644 2-ui/3-event-details/3-mousemove-mouseover-mouseout-mouseenter-mouseleave/2-hoverintent/source.view/style.css delete mode 100644 2-ui/3-event-details/3-mousemove-mouseover-mouseout-mouseenter-mouseleave/2-hoverintent/task.md delete mode 100644 2-ui/3-event-details/3-mousemove-mouseover-mouseout-mouseenter-mouseleave/article.md delete mode 100755 2-ui/3-event-details/3-mousemove-mouseover-mouseout-mouseenter-mouseleave/mouseenter-mouseleave-delegation-2.view/index.html delete mode 100755 2-ui/3-event-details/3-mousemove-mouseover-mouseout-mouseenter-mouseleave/mouseenter-mouseleave-delegation-2.view/script.js delete mode 100755 2-ui/3-event-details/3-mousemove-mouseover-mouseout-mouseenter-mouseleave/mouseenter-mouseleave-delegation-2.view/style.css delete mode 100755 2-ui/3-event-details/3-mousemove-mouseover-mouseout-mouseenter-mouseleave/mouseenter-mouseleave-delegation.view/index.html delete mode 100755 2-ui/3-event-details/3-mousemove-mouseover-mouseout-mouseenter-mouseleave/mouseenter-mouseleave-delegation.view/script.js delete mode 100755 2-ui/3-event-details/3-mousemove-mouseover-mouseout-mouseenter-mouseleave/mouseenter-mouseleave-delegation.view/style.css delete mode 100755 2-ui/3-event-details/3-mousemove-mouseover-mouseout-mouseenter-mouseleave/mouseleave-table.view/index.html delete mode 100755 2-ui/3-event-details/3-mousemove-mouseover-mouseout-mouseenter-mouseleave/mouseleave-table.view/script.js delete mode 100755 2-ui/3-event-details/3-mousemove-mouseover-mouseout-mouseenter-mouseleave/mouseleave-table.view/style.css delete mode 100755 2-ui/3-event-details/3-mousemove-mouseover-mouseout-mouseenter-mouseleave/mouseleave.view/index.html delete mode 100755 2-ui/3-event-details/3-mousemove-mouseover-mouseout-mouseenter-mouseleave/mouseleave.view/script.js delete mode 100755 2-ui/3-event-details/3-mousemove-mouseover-mouseout-mouseenter-mouseleave/mouseleave.view/style.css delete mode 100644 2-ui/3-event-details/3-mousemove-mouseover-mouseout-mouseenter-mouseleave/mouseover-mouseout-from-outside.png delete mode 100644 2-ui/3-event-details/3-mousemove-mouseover-mouseout-mouseenter-mouseleave/mouseover-mouseout-from-outside@2x.png delete mode 100644 2-ui/3-event-details/3-mousemove-mouseover-mouseout-mouseenter-mouseleave/mouseover-mouseout-over-elems.png delete mode 100644 2-ui/3-event-details/3-mousemove-mouseover-mouseout-mouseenter-mouseleave/mouseover-mouseout-over-elems@2x.png delete mode 100644 2-ui/3-event-details/3-mousemove-mouseover-mouseout-mouseenter-mouseleave/mouseover-mouseout.png delete mode 100644 2-ui/3-event-details/3-mousemove-mouseover-mouseout-mouseenter-mouseleave/mouseover-mouseout@2x.png delete mode 100644 2-ui/3-event-details/3-mousemove-mouseover-mouseout-mouseenter-mouseleave/mouseover-to-child.png delete mode 100644 2-ui/3-event-details/3-mousemove-mouseover-mouseout-mouseenter-mouseleave/mouseover-to-child@2x.png delete mode 100755 2-ui/3-event-details/3-mousemove-mouseover-mouseout-mouseenter-mouseleave/mouseoverout-child.view/index.html delete mode 100755 2-ui/3-event-details/3-mousemove-mouseover-mouseout-mouseenter-mouseleave/mouseoverout-child.view/script.js delete mode 100755 2-ui/3-event-details/3-mousemove-mouseover-mouseout-mouseenter-mouseleave/mouseoverout-child.view/style.css delete mode 100755 2-ui/3-event-details/3-mousemove-mouseover-mouseout-mouseenter-mouseleave/mouseoverout-fast.view/index.html delete mode 100755 2-ui/3-event-details/3-mousemove-mouseover-mouseout-mouseenter-mouseleave/mouseoverout-fast.view/script.js delete mode 100755 2-ui/3-event-details/3-mousemove-mouseover-mouseout-mouseenter-mouseleave/mouseoverout-fast.view/style.css delete mode 100755 2-ui/3-event-details/3-mousemove-mouseover-mouseout-mouseenter-mouseleave/mouseoverout.view/index.html delete mode 100755 2-ui/3-event-details/3-mousemove-mouseover-mouseout-mouseenter-mouseleave/mouseoverout.view/script.js delete mode 100755 2-ui/3-event-details/3-mousemove-mouseover-mouseout-mouseenter-mouseleave/mouseoverout.view/style.css delete mode 100644 2-ui/3-event-details/4-drag-and-drop/1-slider/solution.md delete mode 100644 2-ui/3-event-details/4-drag-and-drop/1-slider/solution.view/index.html delete mode 100644 2-ui/3-event-details/4-drag-and-drop/1-slider/solution.view/style.css delete mode 100644 2-ui/3-event-details/4-drag-and-drop/1-slider/source.view/index.html delete mode 100644 2-ui/3-event-details/4-drag-and-drop/1-slider/source.view/style.css delete mode 100644 2-ui/3-event-details/4-drag-and-drop/1-slider/task.md delete mode 100644 2-ui/3-event-details/4-drag-and-drop/2-drag-heroes/solution.md delete mode 100644 2-ui/3-event-details/4-drag-and-drop/2-drag-heroes/solution.view/index.html delete mode 100644 2-ui/3-event-details/4-drag-and-drop/2-drag-heroes/solution.view/soccer.css delete mode 100644 2-ui/3-event-details/4-drag-and-drop/2-drag-heroes/solution.view/soccer.js delete mode 100644 2-ui/3-event-details/4-drag-and-drop/2-drag-heroes/source.view/index.html delete mode 100644 2-ui/3-event-details/4-drag-and-drop/2-drag-heroes/source.view/soccer.css delete mode 100644 2-ui/3-event-details/4-drag-and-drop/2-drag-heroes/source.view/soccer.js delete mode 100644 2-ui/3-event-details/4-drag-and-drop/2-drag-heroes/task.md delete mode 100644 2-ui/3-event-details/4-drag-and-drop/article.md delete mode 100644 2-ui/3-event-details/4-drag-and-drop/ball.view/index.html delete mode 100644 2-ui/3-event-details/4-drag-and-drop/ball2.view/index.html delete mode 100644 2-ui/3-event-details/4-drag-and-drop/ball3.view/index.html delete mode 100644 2-ui/3-event-details/4-drag-and-drop/ball_shift.png delete mode 100644 2-ui/3-event-details/4-drag-and-drop/ball_shift@2x.png delete mode 100644 2-ui/3-event-details/5-drag-and-drop-objects/article.md delete mode 100644 2-ui/3-event-details/5-drag-and-drop-objects/between.png delete mode 100644 2-ui/3-event-details/5-drag-and-drop-objects/dragDemo.view/DragManager.js delete mode 100644 2-ui/3-event-details/5-drag-and-drop-objects/dragDemo.view/dragDemo.css delete mode 100644 2-ui/3-event-details/5-drag-and-drop-objects/dragDemo.view/index.html delete mode 100644 2-ui/3-event-details/5-drag-and-drop-objects/shiftx.png delete mode 100644 2-ui/3-event-details/6-mousewheel/1-scale-with-mouse-wheel/solution.md delete mode 100644 2-ui/3-event-details/6-mousewheel/1-scale-with-mouse-wheel/solution.view/index.html delete mode 100644 2-ui/3-event-details/6-mousewheel/1-scale-with-mouse-wheel/task.md delete mode 100644 2-ui/3-event-details/6-mousewheel/2-no-doc-scroll/solution.md delete mode 100644 2-ui/3-event-details/6-mousewheel/2-no-doc-scroll/solution.view/fix-textarea-scroll.js delete mode 100644 2-ui/3-event-details/6-mousewheel/2-no-doc-scroll/solution.view/index.html delete mode 100644 2-ui/3-event-details/6-mousewheel/2-no-doc-scroll/source.view/index.html delete mode 100644 2-ui/3-event-details/6-mousewheel/2-no-doc-scroll/task.md delete mode 100644 2-ui/3-event-details/6-mousewheel/article.md delete mode 100644 2-ui/3-event-details/6-mousewheel/wheel.view/index.html delete mode 100644 2-ui/3-event-details/7-fixevent/article.md delete mode 100644 2-ui/3-event-details/8-onscroll/1-avatar-above-scroll/solution.md delete mode 100644 2-ui/3-event-details/8-onscroll/1-avatar-above-scroll/solution.view/index.html delete mode 100644 2-ui/3-event-details/8-onscroll/1-avatar-above-scroll/source.view/index.html delete mode 100644 2-ui/3-event-details/8-onscroll/1-avatar-above-scroll/task.md delete mode 100644 2-ui/3-event-details/8-onscroll/2-updown-button/solution.md delete mode 100644 2-ui/3-event-details/8-onscroll/2-updown-button/solution.view/index.html delete mode 100644 2-ui/3-event-details/8-onscroll/2-updown-button/source.view/index.html delete mode 100644 2-ui/3-event-details/8-onscroll/2-updown-button/task.md delete mode 100644 2-ui/3-event-details/8-onscroll/3-load-visible-img/solution.md delete mode 100644 2-ui/3-event-details/8-onscroll/3-load-visible-img/solution.view/index.html delete mode 100644 2-ui/3-event-details/8-onscroll/3-load-visible-img/source.view/index.html delete mode 100644 2-ui/3-event-details/8-onscroll/3-load-visible-img/task.md delete mode 100644 2-ui/3-event-details/8-onscroll/article.md delete mode 100644 2-ui/3-event-details/9-keyboard-events/1-numeric-input/solution.md delete mode 100644 2-ui/3-event-details/9-keyboard-events/1-numeric-input/solution.view/index.html delete mode 100644 2-ui/3-event-details/9-keyboard-events/1-numeric-input/source.view/index.html delete mode 100644 2-ui/3-event-details/9-keyboard-events/1-numeric-input/task.md delete mode 100644 2-ui/3-event-details/9-keyboard-events/2-check-sync-keydown/solution.md delete mode 100644 2-ui/3-event-details/9-keyboard-events/2-check-sync-keydown/solution.view/index.html delete mode 100644 2-ui/3-event-details/9-keyboard-events/2-check-sync-keydown/task.md delete mode 100644 2-ui/3-event-details/9-keyboard-events/article.md delete mode 100644 2-ui/3-event-details/9-keyboard-events/keyboard-dump.view/index.html delete mode 100644 2-ui/3-event-details/9-keyboard-events/keyboard-dump.view/script.js delete mode 100644 2-ui/3-event-details/9-keyboard-events/keyboard-dump.view/style.css delete mode 100644 2-ui/3-event-details/index.md delete mode 100644 2-ui/4-forms-controls/1-form-elements/1-add-select-option/solution.md delete mode 100644 2-ui/4-forms-controls/1-form-elements/1-add-select-option/task.md delete mode 100644 2-ui/4-forms-controls/1-form-elements/article.md delete mode 100755 2-ui/4-forms-controls/1-form-elements/form.png delete mode 100644 2-ui/4-forms-controls/2-focus-blur/1-emulate-placeholder/solution.md delete mode 100755 2-ui/4-forms-controls/2-focus-blur/1-emulate-placeholder/solution.view/index.html delete mode 100755 2-ui/4-forms-controls/2-focus-blur/1-emulate-placeholder/source.view/index.html delete mode 100644 2-ui/4-forms-controls/2-focus-blur/1-emulate-placeholder/task.md delete mode 100644 2-ui/4-forms-controls/2-focus-blur/2-keyboard-mouse/solution.md delete mode 100755 2-ui/4-forms-controls/2-focus-blur/2-keyboard-mouse/solution.view/index.html delete mode 100755 2-ui/4-forms-controls/2-focus-blur/2-keyboard-mouse/source.view/index.html delete mode 100644 2-ui/4-forms-controls/2-focus-blur/2-keyboard-mouse/task.md delete mode 100644 2-ui/4-forms-controls/2-focus-blur/3-hotkeys/solution.md delete mode 100755 2-ui/4-forms-controls/2-focus-blur/3-hotkeys/solution.view/index.html delete mode 100755 2-ui/4-forms-controls/2-focus-blur/3-hotkeys/solution.view/my.css delete mode 100755 2-ui/4-forms-controls/2-focus-blur/3-hotkeys/source.view/index.html delete mode 100755 2-ui/4-forms-controls/2-focus-blur/3-hotkeys/source.view/my.css delete mode 100644 2-ui/4-forms-controls/2-focus-blur/3-hotkeys/task.md delete mode 100644 2-ui/4-forms-controls/2-focus-blur/4-edit-td-click/solution.md delete mode 100644 2-ui/4-forms-controls/2-focus-blur/4-edit-td-click/solution.view/bagua.css delete mode 100644 2-ui/4-forms-controls/2-focus-blur/4-edit-td-click/solution.view/index.html delete mode 100644 2-ui/4-forms-controls/2-focus-blur/4-edit-td-click/solution.view/my.css delete mode 100644 2-ui/4-forms-controls/2-focus-blur/4-edit-td-click/solution.view/script.js delete mode 100644 2-ui/4-forms-controls/2-focus-blur/4-edit-td-click/source.view/bagua.css delete mode 100644 2-ui/4-forms-controls/2-focus-blur/4-edit-td-click/source.view/index.html delete mode 100644 2-ui/4-forms-controls/2-focus-blur/4-edit-td-click/source.view/my.css delete mode 100644 2-ui/4-forms-controls/2-focus-blur/4-edit-td-click/source.view/script.js delete mode 100644 2-ui/4-forms-controls/2-focus-blur/4-edit-td-click/task.md delete mode 100644 2-ui/4-forms-controls/2-focus-blur/6-input-nice-placeholder/solution.md delete mode 100755 2-ui/4-forms-controls/2-focus-blur/6-input-nice-placeholder/solution.view/index.html delete mode 100644 2-ui/4-forms-controls/2-focus-blur/6-input-nice-placeholder/solution.view/style.css delete mode 100755 2-ui/4-forms-controls/2-focus-blur/6-input-nice-placeholder/source.view/index.html delete mode 100644 2-ui/4-forms-controls/2-focus-blur/6-input-nice-placeholder/source.view/style.css delete mode 100644 2-ui/4-forms-controls/2-focus-blur/6-input-nice-placeholder/task.md delete mode 100644 2-ui/4-forms-controls/2-focus-blur/7-capslock-warning-field/solution.md delete mode 100755 2-ui/4-forms-controls/2-focus-blur/7-capslock-warning-field/solution.view/index.html delete mode 100755 2-ui/4-forms-controls/2-focus-blur/7-capslock-warning-field/source.view/index.html delete mode 100644 2-ui/4-forms-controls/2-focus-blur/7-capslock-warning-field/task.md delete mode 100644 2-ui/4-forms-controls/2-focus-blur/article.md delete mode 100644 2-ui/4-forms-controls/3-events-change/1-calculate-capitalization/solution.md delete mode 100755 2-ui/4-forms-controls/3-events-change/1-calculate-capitalization/solution.view/index.html delete mode 100755 2-ui/4-forms-controls/3-events-change/1-calculate-capitalization/source.view/index.html delete mode 100644 2-ui/4-forms-controls/3-events-change/1-calculate-capitalization/task.md delete mode 100644 2-ui/4-forms-controls/3-events-change/article.md delete mode 100644 2-ui/4-forms-controls/4-forms-submit/1-modal-dialog/solution.md delete mode 100755 2-ui/4-forms-controls/4-forms-submit/1-modal-dialog/solution.view/index.html delete mode 100755 2-ui/4-forms-controls/4-forms-submit/1-modal-dialog/source.view/index.html delete mode 100644 2-ui/4-forms-controls/4-forms-submit/1-modal-dialog/task.md delete mode 100644 2-ui/4-forms-controls/4-forms-submit/2-form-validation/solution.md delete mode 100755 2-ui/4-forms-controls/4-forms-submit/2-form-validation/solution.view/index.html delete mode 100755 2-ui/4-forms-controls/4-forms-submit/2-form-validation/source.view/index.html delete mode 100644 2-ui/4-forms-controls/4-forms-submit/2-form-validation/task.md delete mode 100644 2-ui/4-forms-controls/4-forms-submit/article.md delete mode 100644 2-ui/4-forms-controls/index.md delete mode 100644 2-ui/5-widgets/1-architect-intro/article.md delete mode 100644 2-ui/5-widgets/2-widgets-structure/1-clock/solution.md delete mode 100755 2-ui/5-widgets/2-widgets-structure/1-clock/solution.view/clock.js delete mode 100755 2-ui/5-widgets/2-widgets-structure/1-clock/solution.view/index.html delete mode 100755 2-ui/5-widgets/2-widgets-structure/1-clock/source.view/index.html delete mode 100644 2-ui/5-widgets/2-widgets-structure/1-clock/task.md delete mode 100644 2-ui/5-widgets/2-widgets-structure/2-slider-widget/solution.md delete mode 100755 2-ui/5-widgets/2-widgets-structure/2-slider-widget/solution.view/index.html delete mode 100644 2-ui/5-widgets/2-widgets-structure/2-slider-widget/task.md delete mode 100644 2-ui/5-widgets/2-widgets-structure/3-selectable-list-component/solution.md delete mode 100755 2-ui/5-widgets/2-widgets-structure/3-selectable-list-component/solution.view/index.html delete mode 100755 2-ui/5-widgets/2-widgets-structure/3-selectable-list-component/solution.view/listSelect.js delete mode 100755 2-ui/5-widgets/2-widgets-structure/3-selectable-list-component/solution.view/style.css delete mode 100644 2-ui/5-widgets/2-widgets-structure/3-selectable-list-component/task.md delete mode 100644 2-ui/5-widgets/2-widgets-structure/4-voter/solution.md delete mode 100755 2-ui/5-widgets/2-widgets-structure/4-voter/solution.view/index.html delete mode 100755 2-ui/5-widgets/2-widgets-structure/4-voter/source.view/index.html delete mode 100644 2-ui/5-widgets/2-widgets-structure/4-voter/task.md delete mode 100644 2-ui/5-widgets/2-widgets-structure/5-voter-proto/solution.md delete mode 100755 2-ui/5-widgets/2-widgets-structure/5-voter-proto/solution.view/index.html delete mode 100755 2-ui/5-widgets/2-widgets-structure/5-voter-proto/solution.view/style.css delete mode 100755 2-ui/5-widgets/2-widgets-structure/5-voter-proto/solution.view/voter.js delete mode 100644 2-ui/5-widgets/2-widgets-structure/5-voter-proto/task.md delete mode 100644 2-ui/5-widgets/2-widgets-structure/6-voter-add-step/solution.md delete mode 100644 2-ui/5-widgets/2-widgets-structure/6-voter-add-step/solution.view/index.html delete mode 100644 2-ui/5-widgets/2-widgets-structure/6-voter-add-step/solution.view/step-voter.js delete mode 100644 2-ui/5-widgets/2-widgets-structure/6-voter-add-step/solution.view/style.css delete mode 100644 2-ui/5-widgets/2-widgets-structure/6-voter-add-step/solution.view/voter.js delete mode 100644 2-ui/5-widgets/2-widgets-structure/6-voter-add-step/task.md delete mode 100644 2-ui/5-widgets/2-widgets-structure/article.md delete mode 100644 2-ui/5-widgets/2-widgets-structure/menu-dom.view/index.html delete mode 100644 2-ui/5-widgets/2-widgets-structure/menu-dom.view/menu.js delete mode 100644 2-ui/5-widgets/2-widgets-structure/menu-dom.view/style.css delete mode 100644 2-ui/5-widgets/2-widgets-structure/menu.view/index.html delete mode 100644 2-ui/5-widgets/2-widgets-structure/menu.view/menu.js delete mode 100644 2-ui/5-widgets/2-widgets-structure/menu.view/style.css delete mode 100644 2-ui/5-widgets/3-widgets-markup/1-semantic-menu/solution.md delete mode 100755 2-ui/5-widgets/3-widgets-markup/1-semantic-menu/solution.view/index.html delete mode 100755 2-ui/5-widgets/3-widgets-markup/1-semantic-menu/source.view/index.html delete mode 100644 2-ui/5-widgets/3-widgets-markup/1-semantic-menu/task.md delete mode 100644 2-ui/5-widgets/3-widgets-markup/article.md delete mode 100644 2-ui/5-widgets/4-template-lodash/1-table-template/solution.md delete mode 100755 2-ui/5-widgets/4-template-lodash/1-table-template/solution.view/index.html delete mode 100755 2-ui/5-widgets/4-template-lodash/1-table-template/source.view/index.html delete mode 100644 2-ui/5-widgets/4-template-lodash/1-table-template/task.md delete mode 100644 2-ui/5-widgets/4-template-lodash/2-template-display-none/solution.md delete mode 100644 2-ui/5-widgets/4-template-lodash/2-template-display-none/task.md delete mode 100644 2-ui/5-widgets/4-template-lodash/3-menu-template/solution.md delete mode 100755 2-ui/5-widgets/4-template-lodash/3-menu-template/solution.view/index.html delete mode 100755 2-ui/5-widgets/4-template-lodash/3-menu-template/solution.view/menu.css delete mode 100755 2-ui/5-widgets/4-template-lodash/3-menu-template/solution.view/menu.js delete mode 100755 2-ui/5-widgets/4-template-lodash/3-menu-template/source.view/index.html delete mode 100755 2-ui/5-widgets/4-template-lodash/3-menu-template/source.view/menu.css delete mode 100755 2-ui/5-widgets/4-template-lodash/3-menu-template/source.view/menu.js delete mode 100644 2-ui/5-widgets/4-template-lodash/3-menu-template/task.md delete mode 100644 2-ui/5-widgets/4-template-lodash/article.md delete mode 100644 2-ui/5-widgets/4-template-lodash/menu-template.view/index.html delete mode 100644 2-ui/5-widgets/4-template-lodash/menu-template.view/menu.css delete mode 100644 2-ui/5-widgets/4-template-lodash/menu-template.view/menu.js delete mode 100755 2-ui/5-widgets/4-template-lodash/template-debugger.png delete mode 100755 2-ui/5-widgets/4-template-lodash/template-debugger@2x.png delete mode 100644 2-ui/5-widgets/4-template-lodash/template-error-sourceurl.view/index.html delete mode 100644 2-ui/5-widgets/5-custom-events/1-voter-events/solution.md delete mode 100755 2-ui/5-widgets/5-custom-events/1-voter-events/solution.view/index.html delete mode 100644 2-ui/5-widgets/5-custom-events/1-voter-events/solution.view/voter.js delete mode 100644 2-ui/5-widgets/5-custom-events/1-voter-events/task.md delete mode 100644 2-ui/5-widgets/5-custom-events/2-selectable-list-evented/solution.md delete mode 100755 2-ui/5-widgets/5-custom-events/2-selectable-list-evented/solution.view/index.html delete mode 100644 2-ui/5-widgets/5-custom-events/2-selectable-list-evented/solution.view/listSelect.js delete mode 100644 2-ui/5-widgets/5-custom-events/2-selectable-list-evented/solution.view/style.css delete mode 100644 2-ui/5-widgets/5-custom-events/2-selectable-list-evented/task.md delete mode 100644 2-ui/5-widgets/5-custom-events/3-custom-select/solution.md delete mode 100755 2-ui/5-widgets/5-custom-events/3-custom-select/solution.view/customselect.css delete mode 100755 2-ui/5-widgets/5-custom-events/3-custom-select/solution.view/customselect.js delete mode 100755 2-ui/5-widgets/5-custom-events/3-custom-select/solution.view/index.html delete mode 100644 2-ui/5-widgets/5-custom-events/3-custom-select/source.view/customselect.css delete mode 100644 2-ui/5-widgets/5-custom-events/3-custom-select/source.view/customselect.js delete mode 100755 2-ui/5-widgets/5-custom-events/3-custom-select/source.view/index.html delete mode 100644 2-ui/5-widgets/5-custom-events/3-custom-select/task.md delete mode 100644 2-ui/5-widgets/5-custom-events/4-slider-events/slider.png delete mode 100644 2-ui/5-widgets/5-custom-events/4-slider-events/solution.md delete mode 100644 2-ui/5-widgets/5-custom-events/4-slider-events/solution.view/index.html delete mode 100644 2-ui/5-widgets/5-custom-events/4-slider-events/solution.view/slider.css delete mode 100644 2-ui/5-widgets/5-custom-events/4-slider-events/solution.view/slider.js delete mode 100644 2-ui/5-widgets/5-custom-events/4-slider-events/task.md delete mode 100644 2-ui/5-widgets/5-custom-events/article.md delete mode 100755 2-ui/5-widgets/5-custom-events/menu-callback.view/index.html delete mode 100644 2-ui/5-widgets/5-custom-events/menu-callback.view/menu.css delete mode 100755 2-ui/5-widgets/5-custom-events/menu-callback.view/menu.js delete mode 100755 2-ui/5-widgets/5-custom-events/menu-event.view/index.html delete mode 100644 2-ui/5-widgets/5-custom-events/menu-event.view/menu.css delete mode 100755 2-ui/5-widgets/5-custom-events/menu-event.view/menu.js delete mode 100644 2-ui/5-widgets/6-what-next/article.md delete mode 100644 2-ui/5-widgets/index.md delete mode 100644 2-ui/index.md delete mode 100644 3-webcomponents/1-webcomponents-intro/article.md delete mode 100644 3-webcomponents/1-webcomponents-intro/satellite-expanded.jpg delete mode 100644 3-webcomponents/1-webcomponents-intro/satellite-expanded@2x.jpg delete mode 100644 3-webcomponents/1-webcomponents-intro/satellite.jpg delete mode 100644 3-webcomponents/1-webcomponents-intro/satellite@2x.jpg delete mode 100644 3-webcomponents/1-webcomponents-intro/twitter-components.png delete mode 100644 3-webcomponents/1-webcomponents-intro/twitter-components@2x.png delete mode 100644 3-webcomponents/2-webcomponent-core/article.md delete mode 100644 3-webcomponents/3-shadow-dom/article.md delete mode 100644 3-webcomponents/3-shadow-dom/shadow-content.png delete mode 100644 3-webcomponents/3-shadow-dom/shadow-content@2x.png delete mode 100644 3-webcomponents/3-shadow-dom/shadow-dom-chrome.png delete mode 100644 3-webcomponents/3-shadow-dom/shadow-dom-chrome@2x.png delete mode 100644 3-webcomponents/4-template-tag/article.md delete mode 100644 3-webcomponents/5-css-scoping/article.md delete mode 100644 3-webcomponents/6-link-import/article.md delete mode 100644 3-webcomponents/6-link-import/import-show.view/index.html delete mode 100644 3-webcomponents/6-link-import/import-show.view/timer.html delete mode 100644 3-webcomponents/6-link-import/import-style.view/index.html delete mode 100644 3-webcomponents/6-link-import/import-style.view/timer.html delete mode 100644 3-webcomponents/7-webcomponent-build/article.md delete mode 100644 3-webcomponents/7-webcomponent-build/message.view/index.html delete mode 100644 3-webcomponents/7-webcomponent-build/message.view/ui-message.html delete mode 100644 3-webcomponents/7-webcomponent-build/ui-slider.view/index.html delete mode 100644 3-webcomponents/7-webcomponent-build/ui-slider.view/jquery.html delete mode 100644 3-webcomponents/7-webcomponent-build/ui-slider.view/ui-slider.html delete mode 100644 3-webcomponents/index.md delete mode 100644 4-ajax/1-ajax-intro/article.md delete mode 100644 4-ajax/1-ajax-intro/suggest.png delete mode 100644 4-ajax/1-ajax-intro/tree.html delete mode 100644 4-ajax/10-ajax-jsonp/article.md delete mode 100644 4-ajax/10-ajax-jsonp/jsonp.view/index.html delete mode 100644 4-ajax/10-ajax-jsonp/jsonp.view/scriptRequest.js delete mode 100644 4-ajax/10-ajax-jsonp/jsonp.view/server.js delete mode 100644 4-ajax/11-server-sent-events/article.md delete mode 100644 4-ajax/11-server-sent-events/eventsource.view/index.html delete mode 100644 4-ajax/11-server-sent-events/eventsource.view/server.js delete mode 100644 4-ajax/12-ajax-iframe/article.md delete mode 100644 4-ajax/12-ajax-iframe/comet.png delete mode 100644 4-ajax/12-ajax-iframe/date-activex.view/activex.js delete mode 100644 4-ajax/12-ajax-iframe/date-activex.view/index.html delete mode 100644 4-ajax/12-ajax-iframe/date-activex.view/server.js delete mode 100644 4-ajax/12-ajax-iframe/date-comet.view/iframeComet.js delete mode 100644 4-ajax/12-ajax-iframe/date-comet.view/index.html delete mode 100644 4-ajax/12-ajax-iframe/date-comet.view/server.js delete mode 100644 4-ajax/12-ajax-iframe/date.view/iframe.js delete mode 100644 4-ajax/12-ajax-iframe/date.view/index.html delete mode 100644 4-ajax/12-ajax-iframe/date.view/server.js delete mode 100644 4-ajax/13-csrf/article.md delete mode 100644 4-ajax/14-fetch/article.md delete mode 100644 4-ajax/14-fetch/user.js delete mode 100644 4-ajax/15-ajax-summary/article.md delete mode 100644 4-ajax/2-ajax-nodejs/article.md delete mode 100644 4-ajax/2-ajax-nodejs/example/index.html delete mode 100644 4-ajax/2-ajax-nodejs/example/server.js delete mode 100644 4-ajax/3-ajax-xmlhttprequest/1-phones-list/phones-async.view/index.html delete mode 100644 4-ajax/3-ajax-xmlhttprequest/1-phones-list/phones-async.view/phones.json delete mode 100644 4-ajax/3-ajax-xmlhttprequest/1-phones-list/phones-async.view/server.js delete mode 100644 4-ajax/3-ajax-xmlhttprequest/1-phones-list/phones-list.view/index.html delete mode 100644 4-ajax/3-ajax-xmlhttprequest/1-phones-list/phones-list.view/phones.json delete mode 100644 4-ajax/3-ajax-xmlhttprequest/1-phones-list/phones-list.view/server.js delete mode 100644 4-ajax/3-ajax-xmlhttprequest/1-phones-list/solution.md delete mode 100644 4-ajax/3-ajax-xmlhttprequest/1-phones-list/task.md delete mode 100644 4-ajax/3-ajax-xmlhttprequest/article.md delete mode 100644 4-ajax/3-ajax-xmlhttprequest/phones-async.view/index.html delete mode 100644 4-ajax/3-ajax-xmlhttprequest/phones-async.view/phones.json delete mode 100644 4-ajax/3-ajax-xmlhttprequest/phones-async.view/server.js delete mode 100644 4-ajax/3-ajax-xmlhttprequest/phones.view/index.html delete mode 100644 4-ajax/3-ajax-xmlhttprequest/phones.view/phones.json delete mode 100644 4-ajax/3-ajax-xmlhttprequest/phones.view/server.js delete mode 100644 4-ajax/3-ajax-xmlhttprequest/readystate.view/index.html delete mode 100644 4-ajax/3-ajax-xmlhttprequest/readystate.view/server.js delete mode 100644 4-ajax/4-xhr-forms/article.md delete mode 100644 4-ajax/5-xhr-crossdomain/1-do-we-need-origin/solution.md delete mode 100644 4-ajax/5-xhr-crossdomain/1-do-we-need-origin/task.md delete mode 100644 4-ajax/5-xhr-crossdomain/article.md delete mode 100644 4-ajax/5-xhr-crossdomain/xhr-another-domain.png delete mode 100644 4-ajax/5-xhr-crossdomain/xhr-another-domain@2x.png delete mode 100644 4-ajax/5-xhr-crossdomain/xhr-preflight.png delete mode 100644 4-ajax/5-xhr-crossdomain/xhr-preflight@2x.png delete mode 100644 4-ajax/6-xhr-onprogress/article.md delete mode 100644 4-ajax/6-xhr-onprogress/progress.view/index.html delete mode 100644 4-ajax/6-xhr-onprogress/progress.view/server.js delete mode 100644 4-ajax/7-xhr-resume/article.md delete mode 100644 4-ajax/7-xhr-resume/upload-resume.view/index.html delete mode 100644 4-ajax/7-xhr-resume/upload-resume.view/server.js delete mode 100644 4-ajax/7-xhr-resume/upload-resume.view/uploader.js delete mode 100644 4-ajax/8-xhr-longpoll/article.md delete mode 100644 4-ajax/8-xhr-longpoll/longpoll.png delete mode 100644 4-ajax/8-xhr-longpoll/longpoll.view/browser.js delete mode 100644 4-ajax/8-xhr-longpoll/longpoll.view/index.html delete mode 100644 4-ajax/8-xhr-longpoll/longpoll.view/server.js delete mode 100644 4-ajax/9-websockets/article.md delete mode 100644 4-ajax/9-websockets/websocket.zip delete mode 100644 4-ajax/index.md delete mode 100644 5-animation/1-bezier/article.md delete mode 100644 5-animation/1-bezier/bezier-car.png delete mode 100644 5-animation/1-bezier/bezier-car@2x.png delete mode 100644 5-animation/1-bezier/bezier-letter.png delete mode 100644 5-animation/1-bezier/bezier-letter@2x.png delete mode 100644 5-animation/1-bezier/bezier-vase.png delete mode 100644 5-animation/1-bezier/bezier-vase@2x.png delete mode 100644 5-animation/1-bezier/bezier2.png delete mode 100644 5-animation/1-bezier/bezier2@2x.png delete mode 100644 5-animation/1-bezier/bezier3-draw1.png delete mode 100644 5-animation/1-bezier/bezier3-draw1@2x.png delete mode 100644 5-animation/1-bezier/bezier3-draw2.png delete mode 100644 5-animation/1-bezier/bezier3-draw2@2x.png delete mode 100644 5-animation/1-bezier/bezier3-e.png delete mode 100644 5-animation/1-bezier/bezier3-e@2x.png delete mode 100644 5-animation/1-bezier/bezier3.png delete mode 100644 5-animation/1-bezier/bezier3@2x.png delete mode 100644 5-animation/1-bezier/bezier4-e.png delete mode 100644 5-animation/1-bezier/bezier4-e@2x.png delete mode 100644 5-animation/1-bezier/bezier4.png delete mode 100644 5-animation/1-bezier/bezier4@2x.png delete mode 100644 5-animation/1-bezier/demo.svg delete mode 100644 5-animation/1-bezier/pause.png delete mode 100644 5-animation/1-bezier/play.png delete mode 100644 5-animation/2-css-transitions/1-animate-logo-css/solution.md delete mode 100644 5-animation/2-css-transitions/1-animate-logo-css/solution.view/index.html delete mode 100644 5-animation/2-css-transitions/1-animate-logo-css/source.view/index.html delete mode 100644 5-animation/2-css-transitions/1-animate-logo-css/task.md delete mode 100644 5-animation/2-css-transitions/2-animate-logo-bezier-css/bezier-up.png delete mode 100644 5-animation/2-css-transitions/2-animate-logo-bezier-css/bezier-up@2x.png delete mode 100644 5-animation/2-css-transitions/2-animate-logo-bezier-css/solution.md delete mode 100644 5-animation/2-css-transitions/2-animate-logo-bezier-css/solution.view/index.html delete mode 100644 5-animation/2-css-transitions/2-animate-logo-bezier-css/task.md delete mode 100644 5-animation/2-css-transitions/article.md delete mode 100644 5-animation/2-css-transitions/bezier-linear.png delete mode 100644 5-animation/2-css-transitions/bezier-linear@2x.png delete mode 100644 5-animation/2-css-transitions/bezier-train-over.png delete mode 100644 5-animation/2-css-transitions/bezier-train-over@2x.png delete mode 100644 5-animation/2-css-transitions/boat.view/index.html delete mode 100644 5-animation/2-css-transitions/boat.view/style.css delete mode 100644 5-animation/2-css-transitions/digits-negative-delay.view/index.html delete mode 100644 5-animation/2-css-transitions/digits-negative-delay.view/script.js delete mode 100644 5-animation/2-css-transitions/digits-negative-delay.view/style.css delete mode 100644 5-animation/2-css-transitions/digits.view/index.html delete mode 100644 5-animation/2-css-transitions/digits.view/script.js delete mode 100644 5-animation/2-css-transitions/digits.view/style.css delete mode 100644 5-animation/2-css-transitions/ease-in-out.png delete mode 100644 5-animation/2-css-transitions/ease-in-out@2x.png delete mode 100644 5-animation/2-css-transitions/ease-in.png delete mode 100644 5-animation/2-css-transitions/ease-in@2x.png delete mode 100644 5-animation/2-css-transitions/ease-out.png delete mode 100644 5-animation/2-css-transitions/ease-out@2x.png delete mode 100644 5-animation/2-css-transitions/ease.png delete mode 100644 5-animation/2-css-transitions/ease@2x.png delete mode 100644 5-animation/2-css-transitions/step-end.view/index.html delete mode 100644 5-animation/2-css-transitions/step-end.view/style.css delete mode 100644 5-animation/2-css-transitions/step.view/index.html delete mode 100644 5-animation/2-css-transitions/step.view/style.css delete mode 100644 5-animation/2-css-transitions/train-curve.png delete mode 100644 5-animation/2-css-transitions/train-curve@2x.png delete mode 100644 5-animation/2-css-transitions/train-linear.view/index.html delete mode 100644 5-animation/2-css-transitions/train-linear.view/style.css delete mode 100644 5-animation/2-css-transitions/train-over.view/index.html delete mode 100644 5-animation/2-css-transitions/train-over.view/style.css delete mode 100644 5-animation/2-css-transitions/train.view/index.html delete mode 100644 5-animation/2-css-transitions/train.view/style.css delete mode 100644 5-animation/3-js-animation/1-animate-ball/solution.md delete mode 100644 5-animation/3-js-animation/1-animate-ball/solution.view/index.html delete mode 100644 5-animation/3-js-animation/1-animate-ball/solution.view/style.css delete mode 100644 5-animation/3-js-animation/1-animate-ball/source.view/index.html delete mode 100644 5-animation/3-js-animation/1-animate-ball/source.view/style.css delete mode 100644 5-animation/3-js-animation/1-animate-ball/task.md delete mode 100644 5-animation/3-js-animation/2-animate-ball-hops/solution.md delete mode 100644 5-animation/3-js-animation/2-animate-ball-hops/solution.view/index.html delete mode 100644 5-animation/3-js-animation/2-animate-ball-hops/solution.view/style.css delete mode 100644 5-animation/3-js-animation/2-animate-ball-hops/task.md delete mode 100644 5-animation/3-js-animation/article.md delete mode 100644 5-animation/3-js-animation/back.png delete mode 100644 5-animation/3-js-animation/back.view/index.html delete mode 100644 5-animation/3-js-animation/back.view/style.css delete mode 100644 5-animation/3-js-animation/back@2x.png delete mode 100644 5-animation/3-js-animation/bezier-linear.png delete mode 100644 5-animation/3-js-animation/bezier-linear@2x.png delete mode 100644 5-animation/3-js-animation/bounce-easeinout.view/index.html delete mode 100644 5-animation/3-js-animation/bounce-easeinout.view/style.css delete mode 100644 5-animation/3-js-animation/bounce-easeout.view/index.html delete mode 100644 5-animation/3-js-animation/bounce-easeout.view/style.css delete mode 100644 5-animation/3-js-animation/bounce-inout.png delete mode 100644 5-animation/3-js-animation/bounce-inout@2x.png delete mode 100644 5-animation/3-js-animation/bounce.view/index.html delete mode 100644 5-animation/3-js-animation/bounce.view/style.css delete mode 100644 5-animation/3-js-animation/circ-ease.png delete mode 100644 5-animation/3-js-animation/circ-ease@2x.png delete mode 100644 5-animation/3-js-animation/circ.png delete mode 100644 5-animation/3-js-animation/circ.view/index.html delete mode 100644 5-animation/3-js-animation/circ.view/style.css delete mode 100644 5-animation/3-js-animation/circ@2x.png delete mode 100644 5-animation/3-js-animation/elastic.png delete mode 100644 5-animation/3-js-animation/elastic.view/index.html delete mode 100644 5-animation/3-js-animation/elastic.view/style.css delete mode 100644 5-animation/3-js-animation/elastic@2x.png delete mode 100644 5-animation/3-js-animation/linear.png delete mode 100644 5-animation/3-js-animation/linear@2x.png delete mode 100644 5-animation/3-js-animation/move-raf.view/index.html delete mode 100644 5-animation/3-js-animation/move.view/index.html delete mode 100644 5-animation/3-js-animation/quad.png delete mode 100644 5-animation/3-js-animation/quad.view/index.html delete mode 100644 5-animation/3-js-animation/quad.view/style.css delete mode 100644 5-animation/3-js-animation/quad@2x.png delete mode 100644 5-animation/3-js-animation/quint.png delete mode 100644 5-animation/3-js-animation/quint.view/index.html delete mode 100644 5-animation/3-js-animation/quint.view/style.css delete mode 100644 5-animation/3-js-animation/quint@2x.png delete mode 100644 5-animation/3-js-animation/text.view/index.html delete mode 100644 5-animation/3-js-animation/text.view/style.css delete mode 100644 5-animation/3-js-animation/width.view/animate.js delete mode 100644 5-animation/3-js-animation/width.view/index.html delete mode 100644 5-animation/index.md delete mode 100644 6-optimize/1-optimize-intro/article.md delete mode 100644 6-optimize/2-minification/article.md delete mode 100644 6-optimize/2-minification/my.png delete mode 100644 6-optimize/2-minification/my.svg delete mode 100644 6-optimize/2-minification/my@2x.png delete mode 100644 6-optimize/3-better-minification/article.md delete mode 100644 6-optimize/4-memory-leaks/article.md delete mode 100644 6-optimize/4-memory-leaks/chrome.png delete mode 100644 6-optimize/4-memory-leaks/goodluck.png delete mode 100644 6-optimize/4-memory-leaks/ie1.png delete mode 100644 6-optimize/4-memory-leaks/ie2.png delete mode 100644 6-optimize/4-memory-leaks/ie9_disable1.png delete mode 100644 6-optimize/4-memory-leaks/ie9_disable2.png delete mode 100644 6-optimize/4-memory-leaks/leak-ie8-2.view/index.html delete mode 100644 6-optimize/4-memory-leaks/leak-ie8-table.view/index.html delete mode 100644 6-optimize/4-memory-leaks/leak-ie8-widget.view/index.html delete mode 100644 6-optimize/4-memory-leaks/leak-ie8-xhr.view/index.html delete mode 100644 6-optimize/4-memory-leaks/leak-ie8.view/index.html delete mode 100644 6-optimize/4-memory-leaks/leak-xhr-2.png delete mode 100644 6-optimize/4-memory-leaks/leak-xhr-2@2x.png delete mode 100644 6-optimize/4-memory-leaks/leak-xhr.png delete mode 100644 6-optimize/4-memory-leaks/leak-xhr@2x.png delete mode 100644 6-optimize/5-memory-leaks-jquery/article.md delete mode 100644 6-optimize/6-memory-removechild-innerhtml/article.md delete mode 100644 6-optimize/6-memory-removechild-innerhtml/html-innerhtml.png delete mode 100644 6-optimize/6-memory-removechild-innerhtml/html-list.png delete mode 100644 6-optimize/6-memory-removechild-innerhtml/html.png delete mode 100644 6-optimize/7-gcc-advanced-optimization/article.md delete mode 100644 6-optimize/8-gcc-check-types/article.md delete mode 100644 6-optimize/9-gcc-closure-library/article.md delete mode 100644 6-optimize/index.md delete mode 100644 7-frames-and-windows/1-window-methods/article.md delete mode 100644 7-frames-and-windows/2-iframes/article.md delete mode 100644 7-frames-and-windows/2-iframes/sandbox.view/index.html delete mode 100644 7-frames-and-windows/2-iframes/sandbox.view/sandboxed.html delete mode 100644 7-frames-and-windows/3-same-origin-policy/article.md delete mode 100644 7-frames-and-windows/4-cross-window-messaging-with-postmessage/article.md delete mode 100644 7-frames-and-windows/5-window-focus/article.md delete mode 100644 7-frames-and-windows/6-clickjacking/article.md delete mode 100644 7-frames-and-windows/6-clickjacking/clickjacking-visible.view/facebook.html delete mode 100644 7-frames-and-windows/6-clickjacking/clickjacking-visible.view/index.html delete mode 100644 7-frames-and-windows/6-clickjacking/clickjacking.view/facebook.html delete mode 100644 7-frames-and-windows/6-clickjacking/clickjacking.view/index.html delete mode 100644 7-frames-and-windows/6-clickjacking/top-location.view/iframe.html delete mode 100644 7-frames-and-windows/6-clickjacking/top-location.view/index.html delete mode 100644 7-frames-and-windows/index.md delete mode 100644 8-css-for-js/1-css-why/article.md delete mode 100644 8-css-for-js/10-box-sizing/article.md delete mode 100644 8-css-for-js/10-box-sizing/border-box.png delete mode 100644 8-css-for-js/10-box-sizing/border-box@2x.png delete mode 100644 8-css-for-js/11-margin/1-failing-margins/solution.md delete mode 100644 8-css-for-js/11-margin/1-failing-margins/task.md delete mode 100644 8-css-for-js/11-margin/2-position-text-into-input/solution.md delete mode 100644 8-css-for-js/11-margin/2-position-text-into-input/solution.view/index.html delete mode 100644 8-css-for-js/11-margin/2-position-text-into-input/source.view/index.html delete mode 100644 8-css-for-js/11-margin/2-position-text-into-input/task.md delete mode 100644 8-css-for-js/11-margin/article.md delete mode 100644 8-css-for-js/11-margin/h2-margin-top-position.view/index.html delete mode 100644 8-css-for-js/11-margin/h2-margin-top.view/index.html delete mode 100644 8-css-for-js/11-margin/hr-margin-left-src.view/index.html delete mode 100644 8-css-for-js/11-margin/hr-margin-left.view/index.html delete mode 100644 8-css-for-js/11-margin/negative-margin-bottom.view/index.html delete mode 100644 8-css-for-js/12-space-under-img/article.md delete mode 100644 8-css-for-js/12-space-under-img/block.view/index.html delete mode 100644 8-css-for-js/12-space-under-img/inline-p.view/index.html delete mode 100644 8-css-for-js/12-space-under-img/inline.view/index.html delete mode 100644 8-css-for-js/12-space-under-img/valign-p.view/index.html delete mode 100644 8-css-for-js/12-space-under-img/valign-small-lh.view/index.html delete mode 100644 8-css-for-js/12-space-under-img/valign-small.view/index.html delete mode 100644 8-css-for-js/12-space-under-img/valign.view/index.html delete mode 100644 8-css-for-js/13-overflow/article.md delete mode 100644 8-css-for-js/14-height-percent/article.md delete mode 100644 8-css-for-js/14-height-percent/height-percent-float-exact.view/index.html delete mode 100644 8-css-for-js/14-height-percent/height-percent-float.view/index.html delete mode 100644 8-css-for-js/14-height-percent/height-percent.view/index.html delete mode 100644 8-css-for-js/15-css-selectors/1-select-elements-selector/index.html delete mode 100644 8-css-for-js/15-css-selectors/1-select-elements-selector/solution.md delete mode 100644 8-css-for-js/15-css-selectors/1-select-elements-selector/source.view/index.html delete mode 100644 8-css-for-js/15-css-selectors/1-select-elements-selector/task.md delete mode 100644 8-css-for-js/15-css-selectors/2-margin-between-pairs-size-1/solution.md delete mode 100644 8-css-for-js/15-css-selectors/2-margin-between-pairs-size-1/solution.view/index.html delete mode 100644 8-css-for-js/15-css-selectors/2-margin-between-pairs-size-1/source.view/index.html delete mode 100644 8-css-for-js/15-css-selectors/2-margin-between-pairs-size-1/task.md delete mode 100644 8-css-for-js/15-css-selectors/3-margin-between-pairs/index.html delete mode 100644 8-css-for-js/15-css-selectors/3-margin-between-pairs/solution.md delete mode 100644 8-css-for-js/15-css-selectors/3-margin-between-pairs/solution.view/index.html delete mode 100644 8-css-for-js/15-css-selectors/3-margin-between-pairs/source.view/index.html delete mode 100644 8-css-for-js/15-css-selectors/3-margin-between-pairs/task.md delete mode 100644 8-css-for-js/15-css-selectors/article.md delete mode 100644 8-css-for-js/15-css-selectors/nthchild-type.view/index.html delete mode 100644 8-css-for-js/15-css-selectors/nthchild.view/index.html delete mode 100644 8-css-for-js/15-css-selectors/relation.view/index.html delete mode 100644 8-css-for-js/17-css-sprite/article.gif delete mode 100644 8-css-for-js/17-css-sprite/article.md delete mode 100644 8-css-for-js/17-css-sprite/height48.view/index.html delete mode 100644 8-css-for-js/17-css-sprite/icons.gif delete mode 100644 8-css-for-js/17-css-sprite/minus.gif delete mode 100644 8-css-for-js/17-css-sprite/plus.gif delete mode 100644 8-css-for-js/17-css-sprite/sprite-example/index.html delete mode 100644 8-css-for-js/17-css-sprite/sprite-tree-1/height48.view/index.html delete mode 100644 8-css-for-js/17-css-sprite/sprite-tree-1/index.html delete mode 100644 8-css-for-js/17-css-sprite/sprite-tree-src.view/index.html delete mode 100644 8-css-for-js/17-css-sprite/sprite-tree.view/index.html delete mode 100644 8-css-for-js/17-css-sprite/sprites-example-lines2.png delete mode 100644 8-css-for-js/17-css-sprite/sprites-example.png delete mode 100644 8-css-for-js/18-css-format/article.md delete mode 100644 8-css-for-js/2-css-units/article.md delete mode 100644 8-css-for-js/3-display/article.md delete mode 100644 8-css-for-js/4-float/1-inline-block-vs-float/gallery-float-diffsize.png delete mode 100644 8-css-for-js/4-float/1-inline-block-vs-float/gallery-float-diffsize.view/index.html delete mode 100644 8-css-for-js/4-float/1-inline-block-vs-float/gallery-inline-block.view/index.html delete mode 100644 8-css-for-js/4-float/1-inline-block-vs-float/solution.md delete mode 100644 8-css-for-js/4-float/1-inline-block-vs-float/solution.view/index.html delete mode 100644 8-css-for-js/4-float/1-inline-block-vs-float/task.md delete mode 100644 8-css-for-js/4-float/2-tree-with-multiline-nodes/solution.md delete mode 100644 8-css-for-js/4-float/2-tree-with-multiline-nodes/solution.view/index.html delete mode 100644 8-css-for-js/4-float/2-tree-with-multiline-nodes/source.view/index.html delete mode 100644 8-css-for-js/4-float/2-tree-with-multiline-nodes/task.md delete mode 100644 8-css-for-js/4-float/3-paginator-css/nav-div-wrong/arrow-left.jpg delete mode 100644 8-css-for-js/4-float/3-paginator-css/nav-div-wrong/arrow-right.jpg delete mode 100644 8-css-for-js/4-float/3-paginator-css/nav-div-wrong/index.html delete mode 100644 8-css-for-js/4-float/3-paginator-css/solution.md delete mode 100644 8-css-for-js/4-float/3-paginator-css/solution.view/index.html delete mode 100644 8-css-for-js/4-float/3-paginator-css/source.view/index.html delete mode 100644 8-css-for-js/4-float/3-paginator-css/task.md delete mode 100644 8-css-for-js/4-float/4-add-border-keep-width/solution.md delete mode 100644 8-css-for-js/4-float/4-add-border-keep-width/task.md delete mode 100644 8-css-for-js/4-float/article.md delete mode 100644 8-css-for-js/4-float/float-small-margin.png delete mode 100644 8-css-for-js/4-float/gallery-float.view/index.html delete mode 100644 8-css-for-js/4-float/text.png delete mode 100644 8-css-for-js/4-float/two-columns-2.view/index.html delete mode 100644 8-css-for-js/4-float/two-columns.view/index.html delete mode 100644 8-css-for-js/4-float/winnie-block-bg.view/index.html delete mode 100644 8-css-for-js/4-float/winnie-block.view/index.html delete mode 100644 8-css-for-js/4-float/winnie-clear-1.view/index.html delete mode 100644 8-css-for-js/4-float/winnie-clear-2.view/index.html delete mode 100644 8-css-for-js/4-float/winnie-clear-3.view/index.html delete mode 100644 8-css-for-js/4-float/winnie-clear-4.view/index.html delete mode 100644 8-css-for-js/4-float/winnie-clearfill-clearfix.view/index.html delete mode 100644 8-css-for-js/4-float/winnie-clearfill-div.view/index.html delete mode 100644 8-css-for-js/4-float/winnie-clearfill-float.view/index.html delete mode 100644 8-css-for-js/4-float/winnie-clearfill-overflow.view/index.html delete mode 100644 8-css-for-js/4-float/winnie-nofloat-1.view/index.html delete mode 100644 8-css-for-js/4-float/winnie-nofloat-2.view/index.html delete mode 100644 8-css-for-js/4-float/winnie-nofloat-3.view/index.html delete mode 100644 8-css-for-js/4-float/winnie-nofloat.view/index.html delete mode 100644 8-css-for-js/4-float/winnie.view/index.html delete mode 100644 8-css-for-js/5-position/1-modal-window/solution.md delete mode 100644 8-css-for-js/5-position/1-modal-window/solution.view/index.html delete mode 100644 8-css-for-js/5-position/1-modal-window/source.view/index.html delete mode 100644 8-css-for-js/5-position/1-modal-window/task.md delete mode 100644 8-css-for-js/5-position/article.md delete mode 100644 8-css-for-js/5-position/position-100-wrong.view/index.html delete mode 100644 8-css-for-js/6-css-center/1-center-ball-css/solution.md delete mode 100644 8-css-for-js/6-css-center/1-center-ball-css/solution.view/index.html delete mode 100644 8-css-for-js/6-css-center/1-center-ball-css/source.view/index.html delete mode 100644 8-css-for-js/6-css-center/1-center-ball-css/task.md delete mode 100644 8-css-for-js/6-css-center/2-form-modal/solution.md delete mode 100644 8-css-for-js/6-css-center/2-form-modal/solution.view/index.html delete mode 100644 8-css-for-js/6-css-center/2-form-modal/source.view/index.html delete mode 100644 8-css-for-js/6-css-center/2-form-modal/task.md delete mode 100644 8-css-for-js/6-css-center/3-vertical-align-table-cell-position/solution.md delete mode 100644 8-css-for-js/6-css-center/3-vertical-align-table-cell-position/task.md delete mode 100644 8-css-for-js/6-css-center/article.md delete mode 100644 8-css-for-js/6-css-center/vertical-align.view/index.html delete mode 100644 8-css-for-js/7-font-size-line-height/article.md delete mode 100644 8-css-for-js/8-white-space/article.md delete mode 100644 8-css-for-js/9-outline/article.md delete mode 100644 8-css-for-js/index.md delete mode 100644 9-tools/1-tools-browser-extensions/article.md delete mode 100644 9-tools/1-tools-browser-extensions/dnsflusher.png delete mode 100644 9-tools/1-tools-browser-extensions/downloadhelper.jpg delete mode 100644 9-tools/1-tools-browser-extensions/jsonview.png delete mode 100644 9-tools/1-tools-browser-extensions/pageinsight.png delete mode 100644 9-tools/1-tools-browser-extensions/webdeveloper.png delete mode 100644 9-tools/2-fiddler/article.md delete mode 100644 9-tools/2-fiddler/fiddler-hook.png delete mode 100644 9-tools/2-fiddler/fiddler.png delete mode 100644 9-tools/3-ie-http-analyzer/article.md delete mode 100644 9-tools/3-ie-http-analyzer/ie-http-analyzer-2.gif delete mode 100644 9-tools/3-ie-http-analyzer/ie-http-analyzer-3.gif delete mode 100644 9-tools/3-ie-http-analyzer/ie-http-analyzer.gif delete mode 100644 9-tools/index.md delete mode 100644 archive/1-class-property/article.md delete mode 100644 archive/2-request-with-auth/solution.md delete mode 100644 archive/2-request-with-auth/task.md delete mode 100644 archive/3-jquery-stub/1-jquery-intro/article.md delete mode 100644 archive/3-jquery-stub/2-jquery-search/article.md delete mode 100644 archive/3-jquery-stub/3-jquery-traversal/1-select-parents-with-self/solution.md delete mode 100644 archive/3-jquery-stub/3-jquery-traversal/1-select-parents-with-self/task.md delete mode 100644 archive/3-jquery-stub/3-jquery-traversal/article.md delete mode 100644 archive/3-jquery-stub/4-jquery-dom/article.md delete mode 100644 archive/3-jquery-stub/5-jquery-stub-article/1-rewrite-with-jquery/solution.md delete mode 100644 archive/3-jquery-stub/5-jquery-stub-article/1-rewrite-with-jquery/solution.view/bagua.css delete mode 100644 archive/3-jquery-stub/5-jquery-stub-article/1-rewrite-with-jquery/solution.view/index.html delete mode 100644 archive/3-jquery-stub/5-jquery-stub-article/1-rewrite-with-jquery/source.view/bagua.css delete mode 100644 archive/3-jquery-stub/5-jquery-stub-article/1-rewrite-with-jquery/source.view/index.html delete mode 100644 archive/3-jquery-stub/5-jquery-stub-article/1-rewrite-with-jquery/task.md delete mode 100644 archive/3-jquery-stub/5-jquery-stub-article/article.md delete mode 100644 archive/3-jquery-stub/index.md delete mode 100644 archive/3-reflow/article.md delete mode 100644 archive/3-reflow/reflow.view/index.html delete mode 100644 archive/4-script-place-optimize/article.md delete mode 100644 archive/menu.html delete mode 100644 archive/upload-2way.view/index.html delete mode 100644 archive/upload-2way.view/server.js delete mode 100644 archive/upload-2way.view/uploader.js delete mode 100644 archive/widget-tasks/1-date-selector/solution.md delete mode 100644 archive/widget-tasks/1-date-selector/solution.view/dateselector.js delete mode 100644 archive/widget-tasks/1-date-selector/solution.view/index.html delete mode 100644 archive/widget-tasks/1-date-selector/source.view/dateselector.js delete mode 100644 archive/widget-tasks/1-date-selector/source.view/index.html delete mode 100644 archive/widget-tasks/1-date-selector/task.md delete mode 100644 archive/widget-tasks/1-tooltip-over-element/solution.md delete mode 100644 archive/widget-tasks/1-tooltip-over-element/solution.view/index.html delete mode 100644 archive/widget-tasks/1-tooltip-over-element/source.view/index.html delete mode 100644 archive/widget-tasks/1-tooltip-over-element/task.md delete mode 100644 archive/widget-tasks/1-tooltip-over-element/tooltip-fixed-center.png delete mode 100644 archive/widget-tasks/1-tooltip-over-element/tooltip-fixed-center2.png delete mode 100644 archive/widget-tasks/2-draggable-windows/index.html delete mode 100644 archive/widget-tasks/2-draggable-windows/solution.md delete mode 100644 archive/widget-tasks/2-draggable-windows/solution.view/draggableWindow.js delete mode 100644 archive/widget-tasks/2-draggable-windows/solution.view/index.html delete mode 100644 archive/widget-tasks/2-draggable-windows/solution.view/window.css delete mode 100644 archive/widget-tasks/2-draggable-windows/source.view/index.html delete mode 100644 archive/widget-tasks/2-draggable-windows/task.md delete mode 100644 archive/widget-tasks/2-moving-tooltip/solution.md delete mode 100644 archive/widget-tasks/2-moving-tooltip/solution.view/index.html delete mode 100644 archive/widget-tasks/2-moving-tooltip/source.view/index.html delete mode 100644 archive/widget-tasks/2-moving-tooltip/task.md delete mode 100644 archive/widget-tasks/3-resize-img/solution.md delete mode 100644 archive/widget-tasks/3-resize-img/solution.view/index.html delete mode 100644 archive/widget-tasks/3-resize-img/source.view/index.html delete mode 100644 archive/widget-tasks/3-resize-img/task.md delete mode 100644 archive/widget-tasks/3-window-manager/solution.md delete mode 100644 archive/widget-tasks/3-window-manager/solution.view/draggableWindow.js delete mode 100644 archive/widget-tasks/3-window-manager/solution.view/index.html delete mode 100644 archive/widget-tasks/3-window-manager/solution.view/window.css delete mode 100644 archive/widget-tasks/3-window-manager/solution.view/windowManager.js delete mode 100644 archive/widget-tasks/3-window-manager/task.md delete mode 100644 archive/widget-tasks/4-double-calendar-with-arrows/solution.md delete mode 100644 archive/widget-tasks/4-double-calendar-with-arrows/solution.view/calendar.css delete mode 100644 archive/widget-tasks/4-double-calendar-with-arrows/solution.view/calendar.js delete mode 100644 archive/widget-tasks/4-double-calendar-with-arrows/solution.view/datepicker.css delete mode 100644 archive/widget-tasks/4-double-calendar-with-arrows/solution.view/datepicker.js delete mode 100644 archive/widget-tasks/4-double-calendar-with-arrows/solution.view/index.html delete mode 100644 archive/widget-tasks/4-double-calendar-with-arrows/source.view/calendar.css delete mode 100644 archive/widget-tasks/4-double-calendar-with-arrows/source.view/calendar.js delete mode 100644 archive/widget-tasks/4-double-calendar-with-arrows/source.view/datepicker.css delete mode 100644 archive/widget-tasks/4-double-calendar-with-arrows/source.view/datepicker.js delete mode 100644 archive/widget-tasks/4-double-calendar-with-arrows/source.view/index.html delete mode 100644 archive/widget-tasks/4-double-calendar-with-arrows/task.md delete mode 100644 archive/widget-tasks/4-img-select-mouse/solution.md delete mode 100644 archive/widget-tasks/4-img-select-mouse/solution.view/index.html delete mode 100644 archive/widget-tasks/4-img-select-mouse/source.view/index.html delete mode 100644 archive/widget-tasks/4-img-select-mouse/task.md delete mode 100644 archive/widget-tasks/5-menu-animated/solution.md delete mode 100644 archive/widget-tasks/5-menu-animated/solution.view/index.html delete mode 100644 archive/widget-tasks/5-menu-animated/source.view/index.html delete mode 100644 archive/widget-tasks/5-menu-animated/task.md delete mode 100644 archive/widget-tasks/5-tree-checkboxes/solution.md delete mode 100644 archive/widget-tasks/5-tree-checkboxes/solution.view/fetch.js delete mode 100644 archive/widget-tasks/5-tree-checkboxes/solution.view/index.html delete mode 100644 archive/widget-tasks/5-tree-checkboxes/solution.view/regions.js delete mode 100644 archive/widget-tasks/5-tree-checkboxes/solution.view/tree.css delete mode 100644 archive/widget-tasks/5-tree-checkboxes/solution.view/tree.js delete mode 100644 archive/widget-tasks/5-tree-checkboxes/source.view/index.html delete mode 100644 archive/widget-tasks/5-tree-checkboxes/task.md delete mode 100644 archive/widget-tasks/7-calendar/solution.md delete mode 100644 archive/widget-tasks/7-calendar/solution.view/calendar.css delete mode 100644 archive/widget-tasks/7-calendar/solution.view/calendar.js delete mode 100644 archive/widget-tasks/7-calendar/solution.view/index.html delete mode 100644 archive/widget-tasks/7-calendar/source.view/calendar-table.js delete mode 100644 archive/widget-tasks/7-calendar/source.view/calendar.css delete mode 100644 archive/widget-tasks/7-calendar/source.view/calendar.js delete mode 100644 archive/widget-tasks/7-calendar/source.view/index.html delete mode 100644 archive/widget-tasks/7-calendar/task.md delete mode 100644 archive/widget-tasks/8-autocomplete/solution.md delete mode 100644 archive/widget-tasks/8-autocomplete/solution.view/autocomplete-list.js delete mode 100644 archive/widget-tasks/8-autocomplete/solution.view/autocomplete.css delete mode 100644 archive/widget-tasks/8-autocomplete/solution.view/autocomplete.js delete mode 100644 archive/widget-tasks/8-autocomplete/solution.view/filtering-list-provider.js delete mode 100644 archive/widget-tasks/8-autocomplete/solution.view/index.html delete mode 100644 archive/widget-tasks/8-autocomplete/task.md delete mode 100644 archive/widget-tasks/9-hover-menu-onclick/solution.md delete mode 100644 archive/widget-tasks/9-hover-menu-onclick/solution.view/hoverintent.js delete mode 100644 archive/widget-tasks/9-hover-menu-onclick/solution.view/index.html delete mode 100644 archive/widget-tasks/9-hover-menu-onclick/solution.view/menu.css delete mode 100644 archive/widget-tasks/9-hover-menu-onclick/solution.view/menu.js delete mode 100644 archive/widget-tasks/9-hover-menu-onclick/task.md delete mode 100644 archive/widget-tasks/article.md diff --git a/1-js/1-getting-started/1-intro/article.md b/1-js/1-getting-started/1-intro/article.md index 8d6396cd..f4c6219d 100644 --- a/1-js/1-getting-started/1-intro/article.md +++ b/1-js/1-getting-started/1-intro/article.md @@ -1,49 +1,56 @@ # An introduction to JavaScript -Let's see what's so special about JavaScript, what we can achieve with it and what other technologies coexist with it. +Let's see what's so special about JavaScript, what we can achieve with it and which other technologies play well with it. ## What is JavaScript? *JavaScript* was initially created to *"make webpages alive"*. -The programs in this language are called *scripts*. They are put directly into HTML and execute automatically as it loads. +The programs in this language are called *scripts*. They can be written right in the HTML and execute automatically as the page loads. -Scripts are provided and executed a plain text. They don't need a special preparation or compilation to run. +Scripts are provided and executed a plain text. They don't need a special preparation or a compilation to run. In this aspect, JavaScript is very different from another language called [Java](http://en.wikipedia.org/wiki/Java). [smart header="Why JavaScript?"] When JavaScript was created, it initially had another name: "LiveScript". But Java language was very popular at that time, so it was decided that positioning a new language as a "younger brother" of Java would help. -But as it evolved, JavaScript became a fully independent language, with its own specification called [ECMAScript](http://en.wikipedia.org/wiki/ECMAScript), and now it has no relation to Java altogether. +But as it evolved, JavaScript became a fully independent language, with its own specification called [ECMAScript](http://en.wikipedia.org/wiki/ECMAScript), and now it has no relation to Java at all. -It has quite a few special features that make mastering a bit hard at first, but we'll nicely deal with them later. [/smart] -Since the time of its creation, JavaScript evolved. +At present, JavaScript can execute not only in the browser, but also on the server, or actually on any device where a special program called [an interpreter]("http://en.wikipedia.org/wiki/Interpreter_(computing)") is installed. The execution process is called "an interpretation". -As of now, JavaScript can execute not only in the browser, but also on the server, or actually on any device where a special program called [an interpreter]("http://en.wikipedia.org/wiki/Interpreter_(computing)") is installed. The execution process is called "an interpretation". - -The browser has an embedded JavaScript interpreter, of course. Sometimes it's also called a *JavaScript engine* or a "JavaScript virtual machine". +The browser has an embedded JavaScript interpreter, sometimes it's also called a "JavaScript engine" or a "JavaScript virtual machine". Different engines have different "codenames", for example: -The codenames are usually used when searching for detailed information in the internet. Also, we'll use them further to be more exact. Instead of the words "Chrome supports feature..." we'd rather say "V8 supports feature...", not just because it's more precise, but because that also implies Opera and Node.JS. +The codenames are good to know. They are used when searching for detailed information in the internet. Also, we'll sometimes reference them further in the tutorial. Instead of the words "Chrome supports feature..." we'd rather say "V8 supports feature...", not just because it's more precise, but because that also implies Opera and Node.JS. [smart header="Compilation and interpretation"] -There are in fact two general approaches to execute programs: "compilers" and "interpreters". +There are two general approaches to execute programs: "compilation" and "interpretation". -Modern interpreters actually combine these approaches into one: the script is distributed as a plain text, but prior to execution is converted to the machine language. That's why JavaScript executes very fast. +As we can see, an interpretation is simpler. No intermediate steps involved. But a compilation is more powerful, because the binary code is more "machine-friendly" and runs faster at the end user. + +Modern javascript engines actually combine these approaches into one: +
    +
  1. The script is written and distributed as a plain text (can be compressed/optimized by so-called "javascript minifiers").
  2. +
  3. The engine (in-browser for the web) reads the script and converts it to the machine language. And then it runs it. That's why JavaScript executes very fast. + +Even more than that, the binary code may be adjusted later, through the process of its execution. The engine learns more about the actual data that it works with and then can optimize it better.
  4. +
+ +So the term "interpretation" is used mostly for historical reasons. We do know what there's actually a two-stage (at least) process behind it. [/smart] @@ -51,36 +58,38 @@ Modern interpreters actually combine these approaches into one: the script is di The modern JavaScript is a "safe" programming language. It does not provide low-level access to memory or CPU, because it was initially created for browsers which do not require it. -Other capabilities depend on the environment which runs JavaScript. For instance, Node.JS has functionality that allows JavaScript to read/write arbitrary files, perform network requests etc etc. +Other capabilities depend on the environment which runs JavaScript. For instance, Node.JS has functionality that allows JavaScript to read/write arbitrary files, perform network requests etc. In the browser JavaScript can do everything related to webpage manipulation, interaction with the user and the webserver. -In more details, in-browser JavaScript is able to: +For instance, in-browser JavaScript is able to: ## What in-browser JavaScript can NOT do? -JavaScript abilities in the browser are limited. That is for user safety, mainly not to let an evil webpage access private information or harm the user's data. +JavaScript abilities in the browser are limited for the sake of the user's safety. The aim is to prevent an evil webpage from accessing private information or harming the user's data. + +The examples of such restrictions are: - -Most modern systems that provide scripts know about these attributes and use them. - -Before inserting an external ` -``` - -А если сделать через `var`, то всё будет хорошо. - -Это была реклама того, что надо везде ставить `var`. - - -
  • Ошибка при рекурсии через функцию-свойство `window`. Следующий код "умрет" в IE8-: - -```html - - -``` - -Проблема здесь возникает из-за того, что функция напрямую присвоена в `window.recurse = ...`. Ее не будет при обычном объявлении функции. - -**Этот пример выдаст ошибку только в настоящем IE8!** Не IE9 в режиме эмуляции. Вообще, режим эмуляции позволяет отлавливать где-то 95% несовместимостей и проблем, а для оставшихся 5% вам нужен будет настоящий IE8 в виртуальной машине. -
  • - -[/warn] - - -## Итого - -В результате инициализации, к началу выполнения кода: -
      -
    1. Функции, объявленные как `Function Declaration`, создаются полностью и готовы к использованию.
    2. -
    3. Переменные объявлены, но равны `undefined`. Присваивания выполнятся позже, когда выполнение дойдет до них.
    4. -
    - - diff --git a/1-js/5-functions-closures/2-closures/1-say-phrase-first/solution.md b/1-js/5-functions-closures/2-closures/1-say-phrase-first/solution.md deleted file mode 100644 index ab6567e4..00000000 --- a/1-js/5-functions-closures/2-closures/1-say-phrase-first/solution.md +++ /dev/null @@ -1,16 +0,0 @@ -Ошибки не будет, выведет `"Вася, undefined"`. - -```js -//+ run -*!* -say('Вася'); // Что выведет? Не будет ли ошибки? -*/!* - -var phrase = 'Привет'; - -function say(name) { - alert( name + ", " + phrase ); -} -``` - -Переменная как таковая существует, вот только на момент запуска функции она равна `undefined`. \ No newline at end of file diff --git a/1-js/5-functions-closures/2-closures/1-say-phrase-first/task.md b/1-js/5-functions-closures/2-closures/1-say-phrase-first/task.md deleted file mode 100644 index fe548c0c..00000000 --- a/1-js/5-functions-closures/2-closures/1-say-phrase-first/task.md +++ /dev/null @@ -1,18 +0,0 @@ -# Что выведет say в начале кода? - -[importance 5] - -Что будет, если вызов `sayHi('Вася');` стоит в самом-самом начале, в первой строке кода? - -```js -*!* -say('Вася'); // Что выведет? Не будет ли ошибки? -*/!* - -var phrase = 'Привет'; - -function say(name) { - alert( name + ", " + phrase ); -} -``` - diff --git a/1-js/5-functions-closures/2-closures/2-which-value-is-modified/solution.md b/1-js/5-functions-closures/2-closures/2-which-value-is-modified/solution.md deleted file mode 100644 index eed571f3..00000000 --- a/1-js/5-functions-closures/2-closures/2-which-value-is-modified/solution.md +++ /dev/null @@ -1,9 +0,0 @@ -**Результатом будет `true`**, т.к. `var` обработается и переменная будет создана до выполнения кода. - -Соответственно, присвоение `value=true` сработает на локальной переменной, и `alert` выведет `true`. - -**Внешняя переменная не изменится.** - -P.S. Если `var` нет, то в функции переменная не будет найдена. Интерпретатор обратится за ней в `window` и изменит её там. - -**Так что без `var` результат будет также `true`, но внешняя переменная изменится.** diff --git a/1-js/5-functions-closures/2-closures/2-which-value-is-modified/task.md b/1-js/5-functions-closures/2-closures/2-which-value-is-modified/task.md deleted file mode 100644 index b9f72a30..00000000 --- a/1-js/5-functions-closures/2-closures/2-which-value-is-modified/task.md +++ /dev/null @@ -1,25 +0,0 @@ -# В какую переменную будет присвоено значение? - -[importance 5] - -Каков будет результат выполнения этого кода? - -```js -var value = 0; - -function f() { - if (1) { - value = true; - } else { - var value = false; - } - - alert( value ); -} - -f(); -``` - -Изменится ли внешняя переменная `value` ? - -P.S. Какими будут ответы, если из строки `var value = false` убрать `var`? \ No newline at end of file diff --git a/1-js/5-functions-closures/2-closures/3-var-window/solution.md b/1-js/5-functions-closures/2-closures/3-var-window/solution.md deleted file mode 100644 index e1609417..00000000 --- a/1-js/5-functions-closures/2-closures/3-var-window/solution.md +++ /dev/null @@ -1,29 +0,0 @@ -Результатом будет `undefined`, затем `5`. - -```js -//+ run -function test() { - - alert( window ); - - var window = 5; - - alert( window ); -} - -test(); -``` - -Такой результат получился потому, что `window` -- это глобальная переменная, но ничто не мешает объявить такую же локальную. - -Директива `var window` обработается до начала выполнения кода функции и будет создана локальная переменная, т.е. свойство `LexicalEnvironment.window`: - -```js -LexicalEnvironment = { - window: undefined -} -``` - -Когда выполнение кода начнется и сработает `alert`, он выведет уже локальную переменную, которая на тот момент равна `undefined`. - -Затем сработает присваивание, и второй `alert` выведет уже `5`. \ No newline at end of file diff --git a/1-js/5-functions-closures/2-closures/3-var-window/task.md b/1-js/5-functions-closures/2-closures/3-var-window/task.md deleted file mode 100644 index 8c0e1c7d..00000000 --- a/1-js/5-functions-closures/2-closures/3-var-window/task.md +++ /dev/null @@ -1,19 +0,0 @@ -# var window - -[importance 5] - -Каков будет результат выполнения этого кода? Почему? - -```js -function test() { - - alert( window ); - - var window = 5; - - alert( window ); -} - -test(); -``` - diff --git a/1-js/5-functions-closures/2-closures/4-call-inplace/solution.md b/1-js/5-functions-closures/2-closures/4-call-inplace/solution.md deleted file mode 100644 index 4f08292e..00000000 --- a/1-js/5-functions-closures/2-closures/4-call-inplace/solution.md +++ /dev/null @@ -1,37 +0,0 @@ -Результат - **ошибка**. Попробуйте: - -```js -//+ run no-beautify -var a = 5 - -(function() { - alert(a) -})() -``` - -Дело в том, что после `var a = 5` нет точки с запятой. - -JavaScript воспринимает этот код как если бы перевода строки не было: - -```js -//+ run no-beautify -var a = 5(function() { - alert(a) -})() -``` - -То есть, он пытается вызвать *функцию* `5`, что и приводит к ошибке. - -Если точку с запятой поставить, все будет хорошо: - -```js -//+ run no-beautify -var a = 5; - -(function() { - alert(a) -})() -``` - -Это один из наиболее частых и опасных подводных камней, приводящих к ошибкам тех, кто *не* ставит точки с запятой. - diff --git a/1-js/5-functions-closures/2-closures/4-call-inplace/task.md b/1-js/5-functions-closures/2-closures/4-call-inplace/task.md deleted file mode 100644 index aa4c1b4a..00000000 --- a/1-js/5-functions-closures/2-closures/4-call-inplace/task.md +++ /dev/null @@ -1,17 +0,0 @@ -# Вызов "на месте" - -[importance 4] - -Каков будет результат выполнения кода? Почему? - -```js -//+ no-beautify -var a = 5 - -(function() { - alert(a) -})() -``` - -P.S. *Подумайте хорошо! Здесь все ошибаются!* -P.P.S. *Внимание, здесь подводный камень! Ок, вы предупреждены.* diff --git a/1-js/5-functions-closures/2-closures/5-access-outer-variable/solution.md b/1-js/5-functions-closures/2-closures/5-access-outer-variable/solution.md deleted file mode 100644 index 4e0a619e..00000000 --- a/1-js/5-functions-closures/2-closures/5-access-outer-variable/solution.md +++ /dev/null @@ -1,3 +0,0 @@ -Нет, нельзя. - -Локальная переменная полностью перекрывает внешнюю. diff --git a/1-js/5-functions-closures/2-closures/5-access-outer-variable/task.md b/1-js/5-functions-closures/2-closures/5-access-outer-variable/task.md deleted file mode 100644 index 13e61904..00000000 --- a/1-js/5-functions-closures/2-closures/5-access-outer-variable/task.md +++ /dev/null @@ -1,17 +0,0 @@ -# Перекрытие переменной - -[importance 4] - -Если во внутренней функции есть своя переменная с именем `currentCount` -- можно ли в ней получить `currentCount` из внешней функции? - -```js -function makeCounter() { - var currentCount = 1; - - return function() { - var currentCount; - // можно ли здесь вывести currentCount из внешней функции (равный 1)? - }; -} -``` - diff --git a/1-js/5-functions-closures/2-closures/6-counter-window-variable/solution.md b/1-js/5-functions-closures/2-closures/6-counter-window-variable/solution.md deleted file mode 100644 index b9b3771c..00000000 --- a/1-js/5-functions-closures/2-closures/6-counter-window-variable/solution.md +++ /dev/null @@ -1,30 +0,0 @@ -Выведут **1,2,3,4.** - -Здесь внутренняя функция будет искать -- и находить `currentCount` каждый раз в самом внешнем объекте переменных: глобальном объекте `window`. - -В результате все счётчики будут разделять единое, глобальное текущее значение. - -```js -//+ run -var currentCount = 1; - -function makeCounter() { - return function() { - return currentCount++; - }; -} - -var counter = makeCounter(); -var counter2 = makeCounter(); - -*!* -alert( counter() ); // ? -alert( counter() ); // ? -*/!* - -*!* -alert( counter2() ); // ? -alert( counter2() ); // ? -*/!* -``` - diff --git a/1-js/5-functions-closures/2-closures/6-counter-window-variable/task.md b/1-js/5-functions-closures/2-closures/6-counter-window-variable/task.md deleted file mode 100644 index 48068df9..00000000 --- a/1-js/5-functions-closures/2-closures/6-counter-window-variable/task.md +++ /dev/null @@ -1,29 +0,0 @@ -# Глобальный счётчик - -[importance 5] - -Что выведут эти вызовы, если переменная `currentCount` находится вне `makeCounter`? - -```js -var currentCount = 1; - -function makeCounter() { - return function() { - return currentCount++; - }; -} - -var counter = makeCounter(); -var counter2 = makeCounter(); - -*!* -alert( counter() ); // ? -alert( counter() ); // ? -*/!* - -*!* -alert( counter2() ); // ? -alert( counter2() ); // ? -*/!* -``` - diff --git a/1-js/5-functions-closures/2-closures/6@2x.png b/1-js/5-functions-closures/2-closures/6@2x.png deleted file mode 100755 index 7a276a33141bf1d14fb5f392d7ed1660484ed8d3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23137 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 diff --git a/1-js/5-functions-closures/2-closures/article.md b/1-js/5-functions-closures/2-closures/article.md deleted file mode 100644 index d4301d75..00000000 --- a/1-js/5-functions-closures/2-closures/article.md +++ /dev/null @@ -1,411 +0,0 @@ -# Замыкания, функции изнутри - -В этой главе мы продолжим рассматривать, как работают переменные, и, как следствие, познакомимся с замыканиями. От глобального объекта мы переходим к работе внутри функций. -[cut] -## Лексическое окружение - -Все переменные внутри функции -- это свойства специального внутреннего объекта `LexicalEnvironment`, который создаётся при её запуске. - -Мы будем называть этот объект "лексическое окружение" или просто "объект переменных". - -При запуске функция создает объект `LexicalEnvironment`, записывает туда аргументы, функции и переменные. Процесс инициализации выполняется в том же порядке, что и для глобального объекта, который, вообще говоря, является частным случаем лексического окружения. - -В отличие от `window`, объект `LexicalEnvironment` является внутренним, он скрыт от прямого доступа. - -### Пример - -Посмотрим пример, чтобы лучше понимать, как это работает: - -```js -function sayHi(name) { - var phrase = "Привет, " + name; - alert( phrase ); -} - -sayHi('Вася'); -``` - -При вызове функции: -
      -
    1. До выполнения первой строчки её кода, на стадии инициализации, интерпретатор создает пустой объект `LexicalEnvironment` и заполняет его. - -В данном случае туда попадает аргумент `name` и единственная переменная `phrase`: - -```js -function sayHi(name) { -*!* - // LexicalEnvironment = { name: 'Вася', phrase: undefined } -*/!* - var phrase = "Привет, " + name; - alert( phrase ); -} - -sayHi('Вася'); -``` - -
    2. -
    3. Функция выполняется. - -Во время выполнения происходит присвоение локальной переменной `phrase`, то есть, другими словами, присвоение свойству `LexicalEnvironment.phrase` нового значения: - -```js -function sayHi(name) { - // LexicalEnvironment = { name: 'Вася', phrase: undefined } - var phrase = "Привет, " + name; - -*!* - // LexicalEnvironment = { name: 'Вася', phrase: 'Привет, Вася'} -*/!* - alert( phrase ); -} - -sayHi('Вася'); -``` - -
    4. -
    5. В конце выполнения функции объект с переменными обычно выбрасывается и память очищается. В примерах выше так и происходит. Через некоторое время мы рассмотрим более сложные ситуации, при которых объект с переменными сохраняется и после завершения функции.
    6. -
    - -[smart header="Тонкости спецификации"] -Если почитать спецификацию ECMA-262, то мы увидим, что речь идёт о двух объектах: `VariableEnvironment` и `LexicalEnvironment`. - -Но там же замечено, что в реализациях эти два объекта могут быть объединены. Так что мы избегаем лишних деталей и используем везде термин `LexicalEnvironment`, это достаточно точно позволяет описать происходящее. - -Более формальное описание находится в спецификации ECMA-262, секции 10.2-10.5 и 13. -[/smart] - - -## Доступ ко внешним переменным - -Из функции мы можем обратиться не только к локальной переменной, но и к внешней: - -```js -var userName = "Вася"; - -function sayHi() { - alert( userName ); // "Вася" -} -``` - -**Интерпретатор, при доступе к переменной, сначала пытается найти переменную в текущем `LexicalEnvironment`, а затем, если её нет -- ищет во внешнем объекте переменных. В данном случае им является `window`.** - -Такой порядок поиска возможен благодаря тому, что ссылка на внешний объект переменных хранится в специальном внутреннем свойстве функции, которое называется `[[Scope]]`. Это свойство закрыто от прямого доступа, но знание о нём очень важно для понимания того, как работает JavaScript. - -**При создании функция получает скрытое свойство `[[Scope]]`, которое ссылается на лексическое окружение, в котором она была создана.** - -В примере выше таким окружением является `window`, так что создаётся свойство: -```js -//+ no-beautify -sayHi.[[Scope]] = window -``` - -Это свойство никогда не меняется. Оно всюду следует за функцией, привязывая её, таким образом, к месту своего рождения. - -При запуске функции её объект переменных `LexicalEnvironment` получает ссылку на "внешнее лексическое окружение" со значением из `[[Scope]]`. - -Если переменная не найдена в функции -- она будет искаться снаружи. - -Именно благодаря этой механике в примере выше `alert(userName)` выводит внешнюю переменную. На уровне кода это выглядит как поиск во внешней области видимости, вне функции. - -Если обобщить: -
      -
    • Каждая функция при создании получает ссылку `[[Scope]]` на объект с переменными, в контексте которого была создана.
    • -
    • При запуске функции создаётся новый объект с переменными `LexicalEnvironment`. Он получает ссылку на внешний объект переменных из `[[Scope]]`.
    • -
    • При поиске переменных он осуществляется сначала в текущем объекте переменных, а потом -- по этой ссылке.
    • -
    - -Выглядит настолько просто, что непонятно -- зачем вообще говорить об этом `[[Scope]]`, об объектах переменных. Сказали бы: "Функция читает переменные снаружи" -- и всё. Но знание этих деталей позволит нам легко объяснить и понять более сложные ситуации, с которыми мы столкнёмся далее. - -## Всегда текущее значение - -Значение переменной из внешней области берётся всегда текущее. Оно может быть уже не то, что было на момент создания функции. - -Например, в коде ниже функция `sayHi` берёт `phrase` из внешней области: - -```js -//+ run no-beautify - -var phrase = 'Привет'; - -function say(name) { - alert(phrase + ', ' + name); -} - -*!* -say('Вася'); // Привет, Вася (*) -*/!* - -phrase = 'Пока'; - -*!* -say('Вася'); // Пока, Вася (**) -*/!* -``` - -На момент первого запуска `(*)`, переменная `phrase` имела значение `'Привет'`, а ко второму `(**)` изменила его на `'Пока'`. - -Это естественно, ведь для доступа к внешней переменной функция по ссылке `[[Scope]]` обращается во внешний объект переменных и берёт то значение, которое там есть на момент обращения. - -## Вложенные функции - -Внутри функции можно объявлять не только локальные переменные, но и другие функции. - -К примеру, вложенная функция может помочь лучше организовать код: - -```js -//+ run -function sayHiBye(firstName, lastName) { - - alert( "Привет, " + getFullName() ); - alert( "Пока, " + getFullName() ); - -*!* - function getFullName() { - return firstName + " " + lastName; - } -*/!* - -} - -sayHiBye("Вася", "Пупкин"); // Привет, Вася Пупкин ; Пока, Вася Пупкин -``` - -Здесь, для удобства, создана вспомогательная функция `getFullName()`. - -Вложенные функции получают `[[Scope]]` так же, как и глобальные. В нашем случае: - -```js -//+ no-beautify -getFullName.[[Scope]] = объект переменных текущего запуска sayHiBye -``` - -Благодаря этому `getFullName()` получает снаружи `firstName` и `lastName`. - -Заметим, что если переменная не найдена во внешнем объекте переменных, то она ищется в ещё более внешнем (через `[[Scope]]` внешней функции), то есть, такой пример тоже будет работать: - -```js -//+ run -var phrase = 'Привет'; - -function say() { - - function go() { - alert( phrase ); // найдёт переменную снаружи - } - - go(); -} -``` - -## Возврат функции - -Рассмотрим более "продвинутый" вариант, при котором внутри одной функции создаётся другая и возвращается в качестве результата. - -В разработке интерфейсов это совершенно стандартный приём, функция затем может назначаться как обработчик действий посетителя. - -Здесь мы будем создавать функцию-счётчик, которая считает свои вызовы и возвращает их текущее число. - -В примере ниже `makeCounter` создает такую функцию: - -```js -//+ run -function makeCounter() { -*!* - var currentCount = 1; -*/!* - - return function() { // (**) - return currentCount++; - }; -} - -var counter = makeCounter(); // (*) - -// каждый вызов увеличивает счётчик и возвращает результат -alert( counter() ); // 1 -alert( counter() ); // 2 -alert( counter() ); // 3 - -// создать другой счётчик, он будет независим от первого -var counter2 = makeCounter(); -alert( counter2() ); // 1 -``` - -Как видно, мы получили два независимых счётчика `counter` и `counter2`, каждый из которых незаметным снаружи образом сохраняет текущее количество вызовов. - -Где? Конечно, во внешней переменной `currentCount`, которая у каждого счётчика своя. - -Если подробнее описать происходящее: - -
      -
    1. В строке `(*)` запускается `makeCounter()`. При этом создаётся `LexicalEnvironment` для переменных текущего вызова. В функции есть одна переменная `var currentCount`, которая станет свойством этого объекта. Она изначально инициализуется в `undefined`, затем, в процессе выполнения, получит значение `1`: - -```js -function makeCounter() { -*!* - // LexicalEnvironment = { currentCount: undefined } -*/!* - - var currentCount = 1; - -*!* - // LexicalEnvironment = { currentCount: 1 } -*/!* - - return function() { // [[Scope]] -> LexicalEnvironment (**) - return currentCount++; - }; -} - -var counter = makeCounter(); // (*) -``` - -
    2. -
    3. В процессе выполнения `makeCounter()` создаёт функцию в строке `(**)`. При создании эта функция получает внутреннее свойство `[[Scope]]` со ссылкой на текущий `LexicalEnvironment`.
    4. -
    5. Далее вызов `makeCounter()` завершается и функция `(**)` возвращается и сохраняется во внешней переменной `counter` `(*)`.
    6. -
    - -На этом создание "счётчика" завершено. - -Итоговым значением, записанным в переменную `counter`, является функция: - -```js -function() { // [[Scope]] -> {currentCount: 1} - return currentCount++; -}; -``` - -Возвращённая из `makeCounter()` функция `counter` помнит (через `[[Scope]]`) о том, в каком окружении была создана. - -Это и используется для хранения текущего значения счётчика. - -Далее, когда-нибудь, функция `counter` будет вызвана. Мы не знаем, когда это произойдёт. Может быть, прямо сейчас, но, вообще говоря, совсем не факт. - -Эта функция состоит из одной строки: `return currentCount++`, ни переменных ни параметров в ней нет, поэтому её собственный объект переменных, для краткости назовём его `LE` -- будет пуст. - -Однако, у неё есть свойство `[[Scope]]`, которое указывает на внешнее окружение. Чтобы увеличить и вернуть `currentCount`, интерпретатор ищет в текущем объекте переменных `LE`, не находит, затем идёт во внешний объект, там находит, изменяет и возвращает новое значение: - -```js -//+ run -function makeCounter() { - var currentCount = 1; - - return function() { - return currentCount++; - }; -} - -var counter = makeCounter(); // [[Scope]] -> {currentCount: 1} - -alert( counter() ); // 1, [[Scope]] -> {currentCount: 1} -alert( counter() ); // 2, [[Scope]] -> {currentCount: 2} -alert( counter() ); // 3, [[Scope]] -> {currentCount: 3} -``` - -**Переменную во внешней области видимости можно не только читать, но и изменять.** - - -В примере выше было создано несколько счётчиков. Все они взаимно независимы: - -```js -var counter = makeCounter(); - -var counter2 = makeCounter(); - -alert( counter() ); // 1 -alert( counter() ); // 2 -alert( counter() ); // 3 - -alert( counter2() ); // 1, *!*счётчики независимы*/!* -``` - -Они независимы, потому что при каждом запуске `makeCounter` создаётся свой объект переменных `LexicalEnvironment`, со своим свойством `currentCount`, на который новый счётчик получит ссылку `[[Scope]]`. - - -## Свойства функции - -Функция в JavaScript является объектом, поэтому можно присваивать свойства прямо к ней, вот так: - -```js -//+ run -function f() {} - -f.test = 5; -alert( f.test ); -``` - -Свойства функции не стоит путать с переменными и параметрами. Они совершенно никак не связаны. Переменные доступны только внутри функции, они создаются в процессе её выполнения. Это -- использование функции "как функции". - -А свойство у функции -- доступно отовсюду и всегда. Это -- использование функции "как объекта". - -Если хочется привязать значение к функции, то можно им воспользоваться вместо внешних переменных. - -В качестве демонстрации, перепишем пример со счётчиком: - -```js -//+ run -function makeCounter() { -*!* - function counter() { - return counter.currentCount++; - }; - counter.currentCount = 1; -*/!* - - return counter; -} - -var counter = makeCounter(); -alert( counter() ); // 1 -alert( counter() ); // 2 -``` - -При запуске пример работает также. - -Принципиальная разница -- во внутренней механике и в том, что свойство функции, в отличие от переменной из замыкания -- общедоступно, к нему имеет доступ любой, у кого есть объект функции. - -Например, можно взять и поменять счётчик из внешнего кода: - -```js -var counter = makeCounter(); -alert( counter() ); // 1 - -*!* -counter.currentCount = 5; -*/!* - -alert( counter() ); // 5 -``` - -[smart header="Статические переменные"] -Иногда свойства, привязанные к функции, называют "статическими переменными". - -В некоторых языках программирования можно объявлять переменную, которая сохраняет значение между вызовами функции. В JavaScript ближайший аналог -- такое вот свойство функции. -[/smart] - - -## Итого: замыкания - -[Замыкание](http://en.wikipedia.org/wiki/Closure_(computer_science)) -- это функция вместе со всеми внешними переменными, которые ей доступны. - -Таково стандартное определение, которое есть в Wikipedia и большинстве серьёзных источников по программированию. То есть, замыкание -- это функция + внешние переменные. - -Тем не менее, в JavaScript есть небольшая терминологическая особенность. - -**Обычно, говоря "замыкание функции", подразумевают не саму эту функцию, а именно внешние переменные.** - -Иногда говорят "переменная берётся из замыкания". Это означает -- из внешнего объекта переменных. - - -[smart header="Что это такое -- \"понимать замыкания?\""] -Иногда говорят "Вася молодец, понимает замыкания!". Что это такое -- "понимать замыкания", какой смысл обычно вкладывают в эти слова? - -"Понимать замыкания" в JavaScript означает понимать следующие вещи: -
      -
    1. Все переменные и параметры функций являются свойствами объекта переменных `LexicalEnvironment`. Каждый запуск функции создает новый такой объект. На верхнем уровне им является "глобальный объект", в браузере -- `window`.
    2. -
    3. При создании функция получает системное свойство `[[Scope]]`, которое ссылается на `LexicalEnvironment`, в котором она была создана.
    4. -
    5. При вызове функции, куда бы её ни передали в коде -- она будет искать переменные сначала у себя, а затем во внешних `LexicalEnvironment` с места своего "рождения".
    6. -
    - -В следующих главах мы углубим это понимание дополнительными примерами, а также рассмотрим, что происходит с памятью. -[/smart] diff --git a/1-js/5-functions-closures/3-scope-new-function/article.md b/1-js/5-functions-closures/3-scope-new-function/article.md deleted file mode 100644 index 51cebe40..00000000 --- a/1-js/5-functions-closures/3-scope-new-function/article.md +++ /dev/null @@ -1,93 +0,0 @@ -# [[Scope]] для new Function - - -## Присвоение [[Scope]] для new Function [#scope-Function] - -Есть одно исключение из общего правила присвоения `[[Scope]]`, которое мы рассматривали в предыдущей главе. - -При создании функции с использованием `new Function`, её свойство `[[Scope]]` ссылается не на текущий `LexicalEnvironment`, а на `window`. - -## Пример - -Следующий пример демонстрирует как функция, созданная `new Function`, игнорирует внешнюю переменную `a` и выводит глобальную вместо неё: - -```js -//+ run untrusted refresh -var a = 1; - -function getFunc() { - var a = 2; - -*!* - var func = new Function('', 'alert(a)'); -*/!* - - return func; -} - -getFunc()(); // *!*1*/!*, из window -``` - -Сравним с обычным поведением: - -```js -//+ run untrusted refresh -var a = 1; - -function getFunc() { - var a = 2; - -*!* - var func = function() { alert(a); }; -*/!* - - return func; -} - -getFunc()(); // *!*2*/!*, из LexicalEnvironment функции getFunc -``` - - -## Почему так сделано? - -[warn header="Продвинутые знания"] -Содержимое этой секции содержит продвинутую информацию теоретического характера, которая прямо сейчас не обязательна для дальнейшего изучения JavaScript. -[/warn] - -Эта особенность `new Function`, хоть и выглядит странно, на самом деле весьма полезна. - -Представьте себе, что нам действительно нужно создать функцию из строки кода. Текст кода этой функции неизвестен на момент написания скрипта (иначе зачем `new Function`), но станет известен позже, например получен с сервера или из других источников данных. - -Предположим, что этому коду надо будет взаимодействовать с внешними переменными основного скрипта. - -Но проблема в том, что JavaScript при выкладывании на "боевой сервер" предварительно сжимается минификатором -- специальной программой, которая уменьшает размер кода, убирая из него лишние комментарии, пробелы, что очень важно -- переименовывает локальные переменные на более короткие. - -То есть, если внутри функции есть `var userName`, то минификатор заменит её на `var a` (или другую букву, чтобы не было конфликта), предполагая, что так как переменная видна только внутри функции, то этого всё равно никто не заметит, а код станет короче. И обычно проблем нет. - -...Но если бы `new Function` могла обращаться к внешним переменным, то при попытке доступа к `userName` в сжатом коде была бы ошибка, так как минификатор переименовал её. - -**Получается, что даже если бы мы захотели использовать локальные переменные в `new Function`, то после сжатия были бы проблемы, так как минификатор переименовывает локальные переменные.** - -Описанная особенность `new Function` просто-таки спасает нас от ошибок. - -Ну а если внутри функции, создаваемой через `new Function`, всё же нужно использовать какие-то данные -- без проблем, нужно всего лишь предусмотреть соответствующие параметры и передавать их явным образом, например так: - -```js -//+ run untrusted refresh no-beautify -*!* -var sum = new Function('a, b', ' return a + b; '); -*/!* - -var a = 1, b = 2; - -*!* -alert( sum(a, b) ); // 3 -*/!* -``` - -## Итого - -
      -
    • Функции, создаваемые через `new Function`, имеют значением `[[Scope]]` не внешний объект переменных, а `window`.
    • -
    • Следствие -- такие функции не могут использовать замыкание. Но это хорошо, так как бережёт от ошибок проектирования, да и при сжатии JavaScript проблем не будет. Если же внешние переменные реально нужны -- их можно передать в качестве параметров.
    • -
    diff --git a/1-js/5-functions-closures/4-closures-usage/1-closure-sum/solution.md b/1-js/5-functions-closures/4-closures-usage/1-closure-sum/solution.md deleted file mode 100644 index 2e28ae36..00000000 --- a/1-js/5-functions-closures/4-closures-usage/1-closure-sum/solution.md +++ /dev/null @@ -1,18 +0,0 @@ -Чтобы вторые скобки в вызове работали - первые должны возвращать функцию. - -Эта функция должна знать про `a` и уметь прибавлять `a` к `b`. Вот так: - -```js -//+ run -function sum(a) { - - return function(b) { - return a + b; // возьмет a из внешнего LexicalEnvironment - }; - -} - -alert( sum(1)(2) ); -alert( sum(5)(-1) ); -``` - diff --git a/1-js/5-functions-closures/4-closures-usage/1-closure-sum/task.md b/1-js/5-functions-closures/4-closures-usage/1-closure-sum/task.md deleted file mode 100644 index 5de93f5e..00000000 --- a/1-js/5-functions-closures/4-closures-usage/1-closure-sum/task.md +++ /dev/null @@ -1,13 +0,0 @@ -# Сумма через замыкание - -[importance 4] - -Напишите функцию `sum`, которая работает так: `sum(a)(b) = a+b`. - -Да, именно так, через двойные скобки (это не опечатка). Например: - -```js -sum(1)(2) = 3 -sum(5)(-1) = 4 -``` - diff --git a/1-js/5-functions-closures/4-closures-usage/2-stringbuffer/_js.view/solution.js b/1-js/5-functions-closures/4-closures-usage/2-stringbuffer/_js.view/solution.js deleted file mode 100644 index bda57778..00000000 --- a/1-js/5-functions-closures/4-closures-usage/2-stringbuffer/_js.view/solution.js +++ /dev/null @@ -1,10 +0,0 @@ -function makeBuffer() { - var text = ''; - - return function(piece) { - if (arguments.length == 0) { // вызов без аргументов - return text; - } - text += piece; - }; -}; \ No newline at end of file diff --git a/1-js/5-functions-closures/4-closures-usage/2-stringbuffer/_js.view/test.js b/1-js/5-functions-closures/4-closures-usage/2-stringbuffer/_js.view/test.js deleted file mode 100644 index df3c04f9..00000000 --- a/1-js/5-functions-closures/4-closures-usage/2-stringbuffer/_js.view/test.js +++ /dev/null @@ -1,21 +0,0 @@ -var buffer; -beforeEach(function() { - buffer = makeBuffer(); -}); - -it("возвращает пустую строку по умолчанию", function() { - assert.strictEqual(buffer(), ""); -}); - -it("добавляет аргументы в буффер", function() { - buffer('Замыкания'); - buffer(' Использовать'); - buffer(' Нужно!'); - assert.equal(buffer(), 'Замыкания Использовать Нужно!'); -}); - -it("приводит всё к строке", function() { - buffer(null); - buffer(false); - assert.equal(buffer(), "nullfalse"); -}); \ No newline at end of file diff --git a/1-js/5-functions-closures/4-closures-usage/2-stringbuffer/solution.md b/1-js/5-functions-closures/4-closures-usage/2-stringbuffer/solution.md deleted file mode 100644 index 5f946bfb..00000000 --- a/1-js/5-functions-closures/4-closures-usage/2-stringbuffer/solution.md +++ /dev/null @@ -1,32 +0,0 @@ -Текущее значение текста удобно хранить в замыкании, в локальной переменной `makeBuffer`: - -```js -//+ run -function makeBuffer() { - var text = ''; - - return function(piece) { - if (arguments.length == 0) { // вызов без аргументов - return text; - } - text += piece; - }; -}; - -var buffer = makeBuffer(); - -// добавить значения к буферу -buffer('Замыкания'); -buffer(' Использовать'); -buffer(' Нужно!'); -alert( buffer() ); // 'Замыкания Использовать Нужно!' - -var buffer2 = makeBuffer(); -buffer2(0); -buffer2(1); -buffer2(0); - -alert( buffer2() ); // '010' -``` - -Начальное значение `text = ''` -- пустая строка. Поэтому операция `text += piece` прибавляет `piece` к строке, автоматически преобразуя его к строковому типу, как и требовалось в условии. diff --git a/1-js/5-functions-closures/4-closures-usage/2-stringbuffer/task.md b/1-js/5-functions-closures/4-closures-usage/2-stringbuffer/task.md deleted file mode 100644 index 9f28b7cd..00000000 --- a/1-js/5-functions-closures/4-closures-usage/2-stringbuffer/task.md +++ /dev/null @@ -1,45 +0,0 @@ -# Функция - строковый буфер - -[importance 5] - -В некоторых языках программирования существует объект "строковый буфер", который аккумулирует внутри себя значения. Его функционал состоит из двух возможностей: -
      -
    1. Добавить значение в буфер.
    2. -
    3. Получить текущее содержимое.
    4. -
    - -**Задача -- реализовать строковый буфер на функциях в JavaScript, со следующим синтаксисом:** - -
      -
    • Создание объекта: `var buffer = makeBuffer();`.
    • -
    • Вызов `makeBuffer` должен возвращать такую функцию `buffer`, которая при вызове `buffer(value)` добавляет значение в некоторое внутреннее хранилище, а при вызове без аргументов `buffer()` -- возвращает его.
    • -
    - -Вот пример работы: - -```js -function makeBuffer() { /* ваш код */ } - -var buffer = makeBuffer(); - -// добавить значения к буферу -buffer('Замыкания'); -buffer(' Использовать'); -buffer(' Нужно!'); - -// получить текущее значение -alert( buffer() ); // Замыкания Использовать Нужно! -``` - -Буфер должен преобразовывать все данные к строковому типу: - -```js -var buffer = makeBuffer(); -buffer(0); -buffer(1); -buffer(0); - -alert( buffer() ); // '010' -``` - -Решение не должно использовать глобальные переменные. diff --git a/1-js/5-functions-closures/4-closures-usage/3-stringbuffer-with-clear/_js.view/solution.js b/1-js/5-functions-closures/4-closures-usage/3-stringbuffer-with-clear/_js.view/solution.js deleted file mode 100644 index b7fbc6f6..00000000 --- a/1-js/5-functions-closures/4-closures-usage/3-stringbuffer-with-clear/_js.view/solution.js +++ /dev/null @@ -1,16 +0,0 @@ -function makeBuffer() { - var text = ''; - - function buffer(piece) { - if (arguments.length == 0) { // вызов без аргументов - return text; - } - text += piece; - }; - - buffer.clear = function() { - text = ""; - } - - return buffer; -}; \ No newline at end of file diff --git a/1-js/5-functions-closures/4-closures-usage/3-stringbuffer-with-clear/_js.view/test.js b/1-js/5-functions-closures/4-closures-usage/3-stringbuffer-with-clear/_js.view/test.js deleted file mode 100644 index 0543cc90..00000000 --- a/1-js/5-functions-closures/4-closures-usage/3-stringbuffer-with-clear/_js.view/test.js +++ /dev/null @@ -1,30 +0,0 @@ -var buffer; - -beforeEach(function() { - buffer = makeBuffer(); -}); - -it("возвращает пустую строку по умолчанию", function() { - assert.strictEqual(buffer(), ""); -}); - -it("добавляет аргументы в буффер", function() { - buffer('Замыкания'); - buffer(' Использовать'); - buffer(' Нужно!'); - assert.equal(buffer(), 'Замыкания Использовать Нужно!'); -}); - -it("приводит всё к строке", function() { - buffer(null); - buffer(false); - assert.equal(buffer(), "nullfalse"); -}); - -it("очищает буфер вызовом clear", function() { - buffer("test"); - buffer.clear(); - buffer("первый"); - buffer("второй"); - assert.equal(buffer(), "первыйвторой"); -}); \ No newline at end of file diff --git a/1-js/5-functions-closures/4-closures-usage/3-stringbuffer-with-clear/solution.md b/1-js/5-functions-closures/4-closures-usage/3-stringbuffer-with-clear/solution.md deleted file mode 100644 index c4c45809..00000000 --- a/1-js/5-functions-closures/4-closures-usage/3-stringbuffer-with-clear/solution.md +++ /dev/null @@ -1,34 +0,0 @@ - - -```js -//+ run -function makeBuffer() { - var text = ''; - - function buffer(piece) { - if (arguments.length == 0) { // вызов без аргументов - return text; - } - text += piece; - }; - - buffer.clear = function() { - text = ""; - } - - return buffer; -}; - -var buffer = makeBuffer(); - -buffer("Тест"); -buffer(" тебя не съест "); -alert( buffer() ); // Тест тебя не съест - -*!* -buffer.clear(); -*/!* - -alert( buffer() ); // "" -``` - diff --git a/1-js/5-functions-closures/4-closures-usage/3-stringbuffer-with-clear/task.md b/1-js/5-functions-closures/4-closures-usage/3-stringbuffer-with-clear/task.md deleted file mode 100644 index 319af876..00000000 --- a/1-js/5-functions-closures/4-closures-usage/3-stringbuffer-with-clear/task.md +++ /dev/null @@ -1,24 +0,0 @@ -# Строковый буфер с очисткой - -[importance 5] - -Добавьте буферу из решения задачи [](/task/stringbuffer) метод `buffer.clear()`, который будет очищать текущее содержимое буфера: - -```js -function makeBuffer() { - ...ваш код... -} - -var buffer = makeBuffer(); - -buffer("Тест"); -buffer(" тебя не съест "); -alert( buffer() ); // Тест тебя не съест - -*!* -buffer.clear(); -*/!* - -alert( buffer() ); // "" -``` - diff --git a/1-js/5-functions-closures/4-closures-usage/4-sort-by-field/solution.md b/1-js/5-functions-closures/4-closures-usage/4-sort-by-field/solution.md deleted file mode 100644 index 43ded8f9..00000000 --- a/1-js/5-functions-closures/4-closures-usage/4-sort-by-field/solution.md +++ /dev/null @@ -1,37 +0,0 @@ - - -```js -//+ run -var users = [{ - name: "Вася", - surname: 'Иванов', - age: 20 -}, { - name: "Петя", - surname: 'Чапаев', - age: 25 -}, { - name: "Маша", - surname: 'Медведева', - age: 18 -}]; - -*!* -function byField(field) { - return function(a, b) { - return a[field] > b[field] ? 1 : -1; - } - } -*/!* - -users.sort(byField('name')); -users.forEach(function(user) { - alert( user.name ); -}); - -users.sort(byField('age')); -users.forEach(function(user) { - alert( user.name ); -}); -``` - diff --git a/1-js/5-functions-closures/4-closures-usage/4-sort-by-field/task.md b/1-js/5-functions-closures/4-closures-usage/4-sort-by-field/task.md deleted file mode 100644 index 36701c23..00000000 --- a/1-js/5-functions-closures/4-closures-usage/4-sort-by-field/task.md +++ /dev/null @@ -1,53 +0,0 @@ -# Сортировка - -[importance 5] - -У нас есть массив объектов: - -```js -var users = [{ - name: "Вася", - surname: 'Иванов', - age: 20 -}, { - name: "Петя", - surname: 'Чапаев', - age: 25 -}, { - name: "Маша", - surname: 'Медведева', - age: 18 -}]; -``` - -Обычно сортировка по нужному полю происходит так: - -```js -// по полю name (Вася, Маша, Петя) -users.sort(function(a, b) { - return a.name > b.name ? 1 : -1; -}); - -// по полю age (Маша, Вася, Петя) -users.sort(function(a, b) { - return a.age > b.age ? 1 : -1; -}); -``` - -Мы хотели бы упростить синтаксис до одной строки, вот так: - -```js -users.sort(byField('name')); -users.forEach(function(user) { - alert( user.name ); -}); // Вася, Маша, Петя - -users.sort(byField('age')); -users.forEach(function(user) { - alert( user.name ); -}); // Маша, Вася, Петя -``` - -То есть, вместо того, чтобы каждый раз писать в `sort` `function...` -- будем использовать `byField(...)` - -Напишите функцию `byField(field)`, которую можно использовать в `sort` для сравнения объектов по полю `field`, чтобы пример выше заработал. diff --git a/1-js/5-functions-closures/4-closures-usage/5-filter-through-function/_js.view/solution.js b/1-js/5-functions-closures/4-closures-usage/5-filter-through-function/_js.view/solution.js deleted file mode 100644 index 90cf2689..00000000 --- a/1-js/5-functions-closures/4-closures-usage/5-filter-through-function/_js.view/solution.js +++ /dev/null @@ -1,24 +0,0 @@ -function filter(arr, func) { - var result = []; - - for (var i = 0; i < arr.length; i++) { - var val = arr[i]; - if (func(val)) { - result.push(val); - } - } - - return result; -} - -function inArray(arr) { - return function(x) { - return arr.indexOf(x) != -1; - }; -} - -function inBetween(a, b) { - return function(x) { - return x >= a && x <= b; - }; -} \ No newline at end of file diff --git a/1-js/5-functions-closures/4-closures-usage/5-filter-through-function/_js.view/source.js b/1-js/5-functions-closures/4-closures-usage/5-filter-through-function/_js.view/source.js deleted file mode 100644 index e512f26c..00000000 --- a/1-js/5-functions-closures/4-closures-usage/5-filter-through-function/_js.view/source.js +++ /dev/null @@ -1,11 +0,0 @@ -function filter(arr, fuc) { - // ...ваш код... -} - -function inBetween(a, b) { - // ...ваш код... -} - -function inArray(arr) { - // ...ваш код... -} \ No newline at end of file diff --git a/1-js/5-functions-closures/4-closures-usage/5-filter-through-function/_js.view/test.js b/1-js/5-functions-closures/4-closures-usage/5-filter-through-function/_js.view/test.js deleted file mode 100644 index f03fb743..00000000 --- a/1-js/5-functions-closures/4-closures-usage/5-filter-through-function/_js.view/test.js +++ /dev/null @@ -1,58 +0,0 @@ -var arr; - -before(function() { - arr = [1, 2, 3, 4, 5, 6, 7]; -}); - -describe("inArray", function() { - var checkInArr; - - before(function() { - checkInArr = inArray(arr); - }); - - it("возвращает фильтр для значений в массиве", function() { - assert.isTrue(checkInArr(5)); - assert.isFalse(checkInArr(0)); - }); -}); - - -describe("inBetween", function() { - var checkBetween36; - - before(function() { - checkBetween36 = inBetween(3, 6); - }); - - it("возвращает фильтрa для значений в промежутке", function() { - assert.isTrue(checkBetween36(5)); - assert.isFalse(checkBetween36(0)); - }); -}); - - -describe("filter", function() { - - it("фильтрует через func", function() { - assert.deepEqual(filter(arr, function(a) { - return a % 2 == 0; - }), [2, 4, 6]); - }); - - it("не модифицирует исходный массив", function() { - filter(arr, function(a) { - return a % 2 == 0; - }); - assert.deepEqual(arr, [1, 2, 3, 4, 5, 6, 7]); - }); - - it("поддерживает фильтр inBetween", function() { - assert.deepEqual(filter(arr, inBetween(3, 6)), [3, 4, 5, 6]); - }); - - it("поддерживает фильтр inArray", function() { - assert.deepEqual(filter(arr, inArray([1, 2, 3])), [1, 2, 3]); - }); - -}); \ No newline at end of file diff --git a/1-js/5-functions-closures/4-closures-usage/5-filter-through-function/solution.md b/1-js/5-functions-closures/4-closures-usage/5-filter-through-function/solution.md deleted file mode 100644 index 114fdd5f..00000000 --- a/1-js/5-functions-closures/4-closures-usage/5-filter-through-function/solution.md +++ /dev/null @@ -1,82 +0,0 @@ -# Функция фильтрации - -```js -//+ run -function filter(arr, func) { - var result = []; - - for (var i = 0; i < arr.length; i++) { - var val = arr[i]; - if (func(val)) { - result.push(val); - } - } - - return result; -} - -var arr = [1, 2, 3, 4, 5, 6, 7]; - -alert(filter(arr, function(a) { - return a % 2 == 0; -})); // 2, 4, 6 -``` - -# Фильтр inBetween - -```js -//+ run -function filter(arr, func) { - var result = []; - - for (var i = 0; i < arr.length; i++) { - var val = arr[i]; - if (func(val)) { - result.push(val); - } - } - - return result; -} - -*!* -function inBetween(a, b) { - return function(x) { - return x >= a && x <= b; - }; - } -*/!* - -var arr = [1, 2, 3, 4, 5, 6, 7]; -alert( filter(arr, inBetween(3, 6)) ); // 3,4,5,6 -``` - -# Фильтр inArray - -```js -//+ run -function filter(arr, func) { - var result = []; - - for (var i = 0; i < arr.length; i++) { - var val = arr[i]; - if (func(val)) { - result.push(val); - } - } - - return result; -} - -*!* -function inArray(arr) { - return function(x) { - return arr.indexOf(x) != -1; - }; - } -*/!* - -var arr = [1, 2, 3, 4, 5, 6, 7]; -alert( filter(arr, inArray([1, 2, 10])) ); // 1,2 -``` - diff --git a/1-js/5-functions-closures/4-closures-usage/5-filter-through-function/task.md b/1-js/5-functions-closures/4-closures-usage/5-filter-through-function/task.md deleted file mode 100644 index 7ee691b5..00000000 --- a/1-js/5-functions-closures/4-closures-usage/5-filter-through-function/task.md +++ /dev/null @@ -1,29 +0,0 @@ -# Фильтрация через функцию - -[importance 5] - -
      -
    1. Создайте функцию `filter(arr, func)`, которая получает массив `arr` и возвращает новый, в который входят только те элементы `arr`, для которых `func` возвращает `true`.
    2. -
    3. Создайте набор "готовых фильтров": `inBetween(a,b)` -- "между a,b", `inArray([...])` -- "в массиве `[...]`". -Использование должно быть таким: -
        -
      • `filter(arr, inBetween(3,6))` -- выберет только числа от 3 до 6,
      • -
      • `filter(arr, inArray([1,2,3]))` -- выберет только элементы, совпадающие с одним из значений массива.
      • -
      -
    4. -
    -Пример, как это должно работать: - -```js -/* .. ваш код для filter, inBetween, inArray */ -var arr = [1, 2, 3, 4, 5, 6, 7]; - -alert(filter(arr, function(a) { - return a % 2 == 0 -})); // 2,4,6 - -alert( filter(arr, inBetween(3, 6)) ); // 3,4,5,6 - -alert( filter(arr, inArray([1, 2, 10])) ); // 1,2 -``` - diff --git a/1-js/5-functions-closures/4-closures-usage/6-make-army/_js.view/solution.js b/1-js/5-functions-closures/4-closures-usage/6-make-army/_js.view/solution.js deleted file mode 100644 index 2455c301..00000000 --- a/1-js/5-functions-closures/4-closures-usage/6-make-army/_js.view/solution.js +++ /dev/null @@ -1,19 +0,0 @@ -function makeArmy() { - - var shooters = []; - - for (var i = 0; i < 10; i++) { - - var shooter = (function(x) { - - return function() { - alert(x); - }; - - })(i); - - shooters.push(shooter); - } - - return shooters; -} \ No newline at end of file diff --git a/1-js/5-functions-closures/4-closures-usage/6-make-army/_js.view/source.js b/1-js/5-functions-closures/4-closures-usage/6-make-army/_js.view/source.js deleted file mode 100644 index f9058674..00000000 --- a/1-js/5-functions-closures/4-closures-usage/6-make-army/_js.view/source.js +++ /dev/null @@ -1,13 +0,0 @@ -function makeArmy() { - - var shooters = []; - - for (var i = 0; i < 10; i++) { - var shooter = function() { // функция-стрелок - alert(i); // выводит свой номер - }; - shooters.push(shooter); - } - - return shooters; -} \ No newline at end of file diff --git a/1-js/5-functions-closures/4-closures-usage/6-make-army/_js.view/test.js b/1-js/5-functions-closures/4-closures-usage/6-make-army/_js.view/test.js deleted file mode 100644 index fdfabf66..00000000 --- a/1-js/5-functions-closures/4-closures-usage/6-make-army/_js.view/test.js +++ /dev/null @@ -1,20 +0,0 @@ -var army; -before(function() { - army = makeArmy(); - window.alert = sinon.stub(window, "alert"); -}); - -it("army[0] выводит 0", function() { - army[0](); - assert(alert.calledWith(0)); -}); - - -it("army[5] функция выводит 5", function() { - army[5](); - assert(alert.calledWith(5)); -}); - -after(function() { - window.alert.restore(); -}); \ No newline at end of file diff --git a/1-js/5-functions-closures/4-closures-usage/6-make-army/solution.md b/1-js/5-functions-closures/4-closures-usage/6-make-army/solution.md deleted file mode 100644 index 5628e800..00000000 --- a/1-js/5-functions-closures/4-closures-usage/6-make-army/solution.md +++ /dev/null @@ -1,218 +0,0 @@ -# Что происходит в этом коде - -Функция `makeArmy` делает следующее: -
      -
    1. Создаёт пустой массив `shooter`: - -```js -var shooters = []; -``` - -
    2. -
    3. В цикле заполняет массив элементами через `shooter.push`. -При этом каждый элемент массива -- это функция, так что в итоге после цикла массив будет таким: - -```js -//+ no-beautify -shooters = [ - function () { alert(i); }, - function () { alert(i); }, - function () { alert(i); }, - function () { alert(i); }, - function () { alert(i); }, - function () { alert(i); }, - function () { alert(i); }, - function () { alert(i); }, - function () { alert(i); }, - function () { alert(i); } -]; -``` - -Этот массив возвращается из функции. -
    4. -
    5. Вызов `army[5]()` -- это получение элемента массива (им будет функция), и тут же -- её запуск.
    6. -
    - -# Почему ошибка - -Вначале разберемся, почему все стрелки выводят одно и то же значение. - -В функциях-стрелках `shooter` отсутствует переменная `i`. Когда такая функция вызывается, то `i` она берет из внешнего `LexicalEnvironment`. - -Чему же будет равно это значение `i`? - -К моменту вызова `army[0]()`, функция `makeArmy` уже закончила работу. Цикл завершился, последнее значение было `i=10`. - -В результате все функции `shooter` получают из внешнего лексического кружения это, одно и то же, последнее, значение `i=10`. - -Попробуйте исправить проблему самостоятельно. - -# Исправление (3 варианта) - -Есть несколько способов исправить ситуацию. - -
      -
    1. **Первый способ исправить код - это привязать значение непосредственно к функции-стрелку:** - -```js -//+ run -function makeArmy() { - - var shooters = []; - - for (var i = 0; i < 10; i++) { - -*!* - var shooter = function me() { - alert( me.i ); - }; - shooter.i = i; -*/!* - - shooters.push(shooter); - } - - return shooters; -} - -var army = makeArmy(); - -army[0](); // 0 -army[1](); // 1 -``` - -В этом случае каждая функция хранит в себе свой собственный номер. - -Кстати, обратите внимание на использование Named Function Expression, вот в этом участке: - -```js -... -var shooter = function me() { - alert( me.i ); -}; -... -``` - -Если убрать имя `me` и оставить обращение через `shooter`, то работать не будет: - -```js -for (var i = 0; i < 10; i++) { - var shooter = function() { -*!* - alert( shooter.i ); // вывести свой номер (не работает!) - // потому что откуда функция возьмёт переменную shooter? - // ..правильно, из внешнего объекта, а там она одна на всех -*/!* - }; - shooter.i = i; - shooters.push(shooter); -} -``` - -Вызов `alert(shooter.i)` при вызове будет искать переменную `shooter`, а эта переменная меняет значение по ходу цикла, и к моменту вызову она равна последней функции, созданной в цикле. - -Если использовать Named Function Expression, то имя жёстко привязывается к конкретной функции, и поэтому в коде выше `me.i` возвращает правильный `i`. - -
    2. -
    3. **Другое, более продвинутое решение -- использовать дополнительную функцию для того, чтобы "поймать" текущее значение `i`**: - -```js -//+ run -function makeArmy() { - - var shooters = []; - - for (var i = 0; i < 10; i++) { - -*!* - var shooter = (function(x) { - - return function() { - alert( x ); - }; - - })(i); -*/!* - - shooters.push(shooter); - } - - return shooters; -} - -var army = makeArmy(); - -army[0](); // 0 -army[1](); // 1 -``` - -Посмотрим выделенный фрагмент более внимательно, чтобы понять, что происходит: - -```js -var shooter = (function(x) { - return function() { - alert( x ); - }; -})(i); -``` - -Функция `shooter` создана как результат вызова промежуточного функционального выражения `function(x)`, которое объявляется -- и тут же выполняется, получая `x = i`. - -Так как `function(x)` тут же завершается, то значение `x` больше не меняется. Оно и будет использовано в возвращаемой функции-стрелке. - -Для красоты можно изменить название переменной `x` на `i`, суть происходящего при этом не изменится: - -```js -var shooter = (function(i) { - return function() { - alert( i ); - }; -})(i); -``` - -**Кстати, обратите внимание -- скобки вокруг `function(i)` не нужны**, можно и так: - -```js -var shooter = function(i) { // *!*без скобок вокруг function(i)*/!* - return function() { - alert( i ); - }; -}(i); -``` - -Скобки добавлены в код для лучшей читаемости, чтобы человек, который просматривает его, не подумал, что `var shooter = function`, а понял что это вызов "на месте", и присваивается его результат. -
    4. -
    5. **Еще один забавный способ - обернуть весь цикл во временную функцию**: - -```js -//+ run -function makeArmy() { - - var shooters = []; - -*!* - for (var i = 0; i < 10; i++)(function(i) { - - var shooter = function() { - alert( i ); - }; - - shooters.push(shooter); - - })(i); -*/!* - - return shooters; -} - -var army = makeArmy(); - -army[0](); // 0 -army[1](); // 1 -``` - -Вызов `(function(i) { ... })` обернут в скобки, чтобы интерпретатор понял, что это `Function Expression`. - -Плюс этого способа - в большей читаемости. Фактически, мы не меняем создание `shooter`, а просто обертываем итерацию в функцию. -
    6. -
    \ No newline at end of file diff --git a/1-js/5-functions-closures/4-closures-usage/6-make-army/task.md b/1-js/5-functions-closures/4-closures-usage/6-make-army/task.md deleted file mode 100644 index 15e0d2ae..00000000 --- a/1-js/5-functions-closures/4-closures-usage/6-make-army/task.md +++ /dev/null @@ -1,31 +0,0 @@ -# Армия функций - -[importance 5] - -Следующий код создает массив функций-стрелков `shooters`. По замыслу, каждый стрелок должен выводить свой номер: - -```js -//+ run -function makeArmy() { - - var shooters = []; - - for (var i = 0; i < 10; i++) { - var shooter = function() { // функция-стрелок - alert( i ); // выводит свой номер - }; - shooters.push(shooter); - } - - return shooters; -} - -var army = makeArmy(); - -army[0](); // стрелок выводит 10, а должен 0 -army[5](); // стрелок выводит 10... -// .. все стрелки выводят 10 вместо 0,1,2...9 -``` - -Почему все стрелки́ выводят одно и то же? Поправьте код, чтобы стрелки работали как задумано. Предложите несколько вариантов исправления. - diff --git a/1-js/5-functions-closures/4-closures-usage/article.md b/1-js/5-functions-closures/4-closures-usage/article.md deleted file mode 100644 index 0fa5da2c..00000000 --- a/1-js/5-functions-closures/4-closures-usage/article.md +++ /dev/null @@ -1,125 +0,0 @@ -# Локальные переменные для объекта - -Замыкания можно использовать сотнями способов. Иногда люди сами не замечают, что использовали замыкания -- настолько это просто и естественно. - -В этой главе мы рассмотрим дополнительные примеры использования замыканий и задачи на эту тему. - -[cut] - -## Счётчик-объект - -Ранее мы сделали счётчик. - -Напомню, как он выглядел: - -```js -//+ run -function makeCounter() { - var currentCount = 1; - - return function() { - return currentCount++; - }; -} - -var counter = makeCounter(); - -// каждый вызов возвращает результат, увеличивая счётчик -alert( counter() ); // 1 -alert( counter() ); // 2 -alert( counter() ); // 3 -``` - -Счётчик получился вполне рабочий, но вот только возможностей ему не хватает. Хорошо бы, чтобы можно было сбрасывать значение счётчика или начинать отсчёт с другого значения вместо `1` или... Да много чего можно захотеть от простого счётчика и, тем более, в более сложных проектах. - -**Чтобы добавить счётчику возможностей -- перейдём с функции на полноценный объект:** - -```js -//+ run -function makeCounter() { - var currentCount = 1; - - return { // возвратим объект вместо функции - getNext: function() { - return currentCount++; - }, - - set: function(value) { - currentCount = value; - }, - - reset: function() { - currentCount = 1; - } - }; -} - -var counter = makeCounter(); - -alert( counter.getNext() ); // 1 -alert( counter.getNext() ); // 2 - -counter.set(5); -alert( counter.getNext() ); // 5 -``` - -Теперь функция `makeCounter` возвращает не одну функцию, а объект с несколькими методами: - -
      -
    • `getNext()` -- получить следующее значение, то, что раньше делал вызов `counter()`.
    • -
    • `set(value)` -- поставить значение.
    • -
    • `reset()` -- обнулить счётчик.
    • -
    - -Все они получают ссылку `[[Scope]]` на текущий (внешний) объект переменных. Поэтому вызов любого из этих методов будет получать или модифицировать одно и то же внешнее значение `currentCount`. - -## Объект счётчика + функция - -Изначально, счётчик делался функцией во многом ради красивого вызова: `counter()`, который увеличивал значение и возвращал результат. - -К сожалению, при переходе на объект короткий вызов пропал, вместо него теперь `counter.getNext()`. Но он ведь был таким простым и удобным... - -Поэтому давайте вернём его! - -```js -//+ run -function makeCounter() { - var currentCount = 1; - -*!* - // возвращаемся к функции - function counter() { - return currentCount++; - } -*/!* - - // ...и добавляем ей методы! - counter.set = function(value) { - currentCount = value; - }; - - counter.reset = function() { - currentCount = 0; - }; - - return counter; -} - -var counter = makeCounter(); - -*!* -alert( counter() ); // 1 -alert( counter() ); // 2 - -counter.set(5); -alert( counter() ); // 5 -*/!* -``` - -Красиво, не правда ли? Получился полноценный объект, который можно вдобавок ещё и вызывать. - -Этот трюк часто используется при разработке JavaScript-библиотек. Например, популярная библиотека [jQuery](http://jquery.com) предоставляет глобальную переменную с именем [jQuery](http://api.jquery.com/jQuery/) (доступна также под коротким именем `$`), которая с одной стороны является функцией и может вызываться как `jQuery(...)`, а с другой -- у неё есть различные методы, например `jQuery.type(123)` возвращает тип аргумента. - -Далее вы найдёте различные задачи на понимание замыканий. Рекомендуется их сделать самостоятельно. - - diff --git a/1-js/5-functions-closures/5-closures-module/article.md b/1-js/5-functions-closures/5-closures-module/article.md deleted file mode 100644 index 384a86fb..00000000 --- a/1-js/5-functions-closures/5-closures-module/article.md +++ /dev/null @@ -1,322 +0,0 @@ -# Модули через замыкания - -Приём программирования "модуль" имеет громадное количество вариаций. Он немного похож на счётчик, который мы рассматривали ранее, использует аналогичный приём, но на уровне выше. - -Его цель -- скрыть внутренние детали реализации скрипта. В том числе: временные переменные, константы, вспомогательные мини-функции и т.п. - -## Зачем нужен модуль? - -Допустим, мы хотим разработать скрипт, который делает что-то полезное на странице. - -Умея работать со страницей, мы могли бы сделать много чего, но так как пока этого не было (скоро научимся), то пусть скрипт просто выводит сообщение: - -Файл `hello.js` - -```js -//+ run -// глобальная переменная нашего скрипта -var message = "Привет"; - -// функция для вывода этой переменной -function showMessage() { - alert( message ); -} - -// выводим сообщение -showMessage(); -``` - -У этого скрипта есть свои внутренние переменные и функции. - -В данном случае это `message` и `showMessage`. - -Предположим, что мы хотели бы распространять этот скрипт в виде библиотеки. Каждый, кто хочет, чтобы посетителям выдавалось "Привет" -- может просто подключить этот скрипт. Достаточно скачать и подключить, например, как внешний файл `hello.js` -- и готово. - -**Если подключить подобный скрипт к странице "как есть", то возможен конфликт с переменными, которые она использует.** - -То есть, при подключении к такой странице он её "сломает": - -```html - - - - - -``` - -[edit src="hello-conflict"/] - -Автор страницы ожидает, что библиотека `"hello.js"` просто отработает, без побочных эффектов. А она вместе с этим переопределила `message` в `"Привет"`. - -Если же убрать скрипт `hello.js`, то страница будет выводить правильное сообщение. - -Зная внутреннее устройство `hello.js` нам, конечно, понятно, что проблема возникла потому, что переменная `message` из скрипта `hello.js` перезаписала объявленную на странице. - -## Приём проектирования "Модуль" - -Чтобы проблемы не было, всего-то нужно, чтобы у скрипта была *своя собственная область видимости*, чтобы его переменные не попали на страницу. - -Для этого мы завернём всё его содержимое в функцию, которую тут же запустим. - -Файл `hello.js`, оформленный как модуль: - -```js -//+ run -(function() { - - // глобальная переменная нашего скрипта - var message = "Привет"; - - // функция для вывода этой переменной - function showMessage() { - alert( message ); - } - - // выводим сообщение - showMessage(); - -})(); -``` - -[edit src="hello-module"/] - -Этот скрипт при подключении к той же странице будет работать корректно. - -Будет выводиться "Привет", а затем "Пожалуйста, нажмите на кнопку". - - -### Зачем скобки вокруг функции? - -В примере выше объявление модуля выглядит так: - -```js -//+ run -(function() { - - alert( "объявляем локальные переменные, функции, работаем" ); - // ... - -}()); -``` - -В начале и в конце стоят скобки, так как иначе была бы ошибка. - -Вот, для сравнения, неверный вариант: - -```js -//+ run -function() { - // будет ошибка -}(); -``` - -Ошибка при его запуске произойдет потому, что браузер, видя ключевое слово `function` в основном потоке кода, попытается прочитать `Function Declaration`, а здесь имени нет. - -Впрочем, даже если имя поставить, то работать тоже не будет: - -```js -//+ run -function work() { - // ... -}(); // syntax error -``` - -**Дело в том, что "на месте" разрешено вызывать *только* `Function Expression`.** - -Общее правило таково: - -
      -
    • Если браузер видит `function` в основном потоке кода -- он считает, что это `Function Declaration`.
    • -
    • Если же `function` идёт в составе более сложного выражения, то он считает, что это `Function Expression`.
    • -
    - -Для этого и нужны скобки -- показать, что у нас `Function Expression`, который по правилам JavaScript можно вызвать "на месте". - -Можно показать это другим способом, например поставив перед функцией оператор: - -```js -//+ run no-beautify -+function() { - alert('Вызов на месте'); -}(); - -!function() { - alert('Так тоже будет работать'); -}(); -``` - -## Экспорт значения - -Приём "модуль" используется почти во всех современных библиотеках. - -Ведь что такое библиотека? Это полезные функции, ради которых её подключают, плюс временные переменные и вспомогательные функции, которые библиотека использует внутри себя. - -Посмотрим, к примеру, на библиотеку [Lodash](http://lodash.com/), хотя могли бы и [jQuery](http://jquery.com/), там почти то же самое. - -Если её подключить, то появится специальная переменная `lodash` (короткое имя `_`), которую можно использовать как функцию, и кроме того в неё записаны различные полезных свойства, например: - -
      -
    • `_.defaults(src, dst1, dst2...)` -- копирует в объект `src` те свойства из объектов `dst1`, `dst2` и других, которых там нет.
    • -
    • `_.cloneDeep(obj)` -- делает глубокое копирование объекта `obj`, создавая полностью независимый клон.
    • -
    • `_.size(obj)` -- возвращает количество свойств в объекте, полиморфная функция: можно передать массив или даже 1 значение.
    • -
    - - -Есть и много других функций, подробнее описанных в [документации](https://lodash.com/docs). - -Пример использования: - -```html - -

    Подключим библиотеку

    - - -

    Функция _.defaults() добавляет отсутствующие свойства.

    - -``` - - -Здесь нам не важно, какие, нас интересует именно как описана эта библиотека, как в ней применяется приём "модуль". - -Вот примерная выдержка из исходного файла: - -```js -//+ run no-beautify -;(function() { - -*!* - // lodash - основная функция для библиотеки -*/!* - function lodash(value) { - // ... - } - -*!* - // вспомогательная переменная -*/!* - var version = '2.4.1'; - // ... другие вспомогательные переменные и функции - -*!* - // код функции size, пока что доступен только внутри -*/!* - function size(collection) { - return Object.keys(collection).length; - } - -*!* - // присвоим в lodash size и другие функции, которые нужно вынести из модуля -*/!* - lodash.size = size - // lodash.defaults = ... - // lodash.cloneDeep = ... - -*!* - // "экспортировать" lodash наружу из модуля -*/!* - window._ = lodash; // в оригинальном коде здесь сложнее, но смысл тот же - -}()); -``` - -Внутри внешней функции: -
      -
    1. Происходит что угодно, объявляются свои локальные переменные, функции.
    2. -
    3. В `window` выносится то, что нужно снаружи.
    4. -
    - -Технически, мы могли бы вынести в `window` не только `lodash`, но и вообще все объекты и функции. На практике, как раз наоборот, всё прячут внутри модуля, глобальную область во избежание конфликтов хранят максимально чистой. - -[smart header="Зачем точка с запятой в начале?"] -В начале кода выше находится точка с запятой `;` -- это не опечатка, а особая "защита от дураков". - -Если получится, что несколько JS-файлы объединены в один (и, скорее всего, сжаты минификатором, но это не важно), и программист забыл поставить точку с запятой, то будет ошибка. - -Например, первый файл `a.js`: -```js -var a = 5 -``` - -Второй файл `lib.js`: -```js -//+ no-beautify -(function() { - // без точки с запятой в начале -})() -``` - -После объединения в один файл: - -```js -//+ run no-beautify -*!* -var a = 5 -*/!* - -// библиотека -(function() { - // ... -})(); -``` - -При запуске будет ошибка, потому что интерпретатор перед скобкой сам не вставит точку с запятой. Он просто поймёт код как `var a = 5(function ...)`, то есть пытается вызвать число `5` как функцию. - -Таковы правила языка, и поэтому рекомендуется явно ставить точку с запятой. В данном случае автор lodash ставит `;` перед функцией, чтобы предупредить эту ошибку. -[/smart] - - -## Экспорт через return - -Можно оформить модуль и чуть по-другому, например передать значение через `return`: - -```js -//+ no-beautify -var lodash = (function() { - - var version; - function assignDefaults() { ... } - - return { - defaults: function() { } - } - -})(); -``` - -Здесь, кстати, скобки вокруг внешней `function() { ... }` не обязательны, ведь функция и так объявлена внутри выражения присваивания, а значит -- является Function Expression. - -Тем не менее, лучше их ставить, для улучшения читаемости кода, чтобы было сразу видно, что это не простое присвоение функции. - -## Итого - -Модуль при помощи замыканий -- это оборачивание пакета функционала в единую внешнюю функцию, которая тут же выполняется. - -Все функции модуля будут иметь доступ к другим переменным и внутренним функциям этого же модуля через замыкание. - -Например, `defaults` из примера выше имеет доступ к `assignDefaults`. - -Но снаружи программист, использующий модуль, может обращаться напрямую только к тем, которые экспортированы. Благодаря этому будут скрыты внутренние аспекты реализации, которые нужны только разработчику модуля. - -Можно придумать и много других вариаций такого подхода. В конце концов, "модуль" -- это всего лишь функция-обёртка для скрытия переменных. - - diff --git a/1-js/5-functions-closures/5-closures-module/hello-conflict.view/hello.js b/1-js/5-functions-closures/5-closures-module/hello-conflict.view/hello.js deleted file mode 100755 index 56fa804b..00000000 --- a/1-js/5-functions-closures/5-closures-module/hello-conflict.view/hello.js +++ /dev/null @@ -1,10 +0,0 @@ -// глобальная переменная нашего скрипта -var message = "Привет"; - -// функция для вывода этой переменной -function showMessage() { - alert(message); -} - -// выводим сообщение -showMessage(); \ No newline at end of file diff --git a/1-js/5-functions-closures/5-closures-module/hello-conflict.view/index.html b/1-js/5-functions-closures/5-closures-module/hello-conflict.view/index.html deleted file mode 100755 index ab1ef1e2..00000000 --- a/1-js/5-functions-closures/5-closures-module/hello-conflict.view/index.html +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/1-js/5-functions-closures/5-closures-module/hello-module.view/hello.js b/1-js/5-functions-closures/5-closures-module/hello-module.view/hello.js deleted file mode 100755 index be40a230..00000000 --- a/1-js/5-functions-closures/5-closures-module/hello-module.view/hello.js +++ /dev/null @@ -1,14 +0,0 @@ -(function() { - - // глобальная переменная нашего скрипта - var message = "Привет"; - - // функция для вывода этой переменной - function showMessage() { - alert(message); - } - - // выводим сообщение - showMessage(); - -})(); \ No newline at end of file diff --git a/1-js/5-functions-closures/5-closures-module/hello-module.view/index.html b/1-js/5-functions-closures/5-closures-module/hello-module.view/index.html deleted file mode 100755 index ab1ef1e2..00000000 --- a/1-js/5-functions-closures/5-closures-module/hello-module.view/index.html +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/1-js/5-functions-closures/6-memory-management/article.md b/1-js/5-functions-closures/6-memory-management/article.md deleted file mode 100644 index 0a8c2b36..00000000 --- a/1-js/5-functions-closures/6-memory-management/article.md +++ /dev/null @@ -1,326 +0,0 @@ -# Управление памятью в JavaScript - -Управление памятью в JavaScript обычно происходит незаметно. Мы создаём примитивы, объекты, функции... Всё это занимает память. - -Что происходит с объектом, когда он становится "не нужен"? Возможно ли "переполнение" памяти? Для ответа на эти вопросы -- залезем "под капот" интерпретатора. - -[cut] -## Управление памятью в JavaScript - -Главной концепцией управления памятью в JavaScript является принцип *достижимости* (англ. reachability). - -
      -
    1. Определённое множество значений считается достижимым изначально, в частности: -
        -
      • Значения, ссылки на которые содержатся в стеке вызова, то есть -- все локальные переменные и параметры функций, которые в настоящий момент выполняются или находятся в ожидании окончания вложенного вызова.
      • -
      • Все глобальные переменные.
      • -
      - -Эти значения гарантированно хранятся в памяти. Мы будем называть их *корнями*. -
    2. -
    3. **Любое другое значение сохраняется в памяти лишь до тех пор, пока доступно из корня по ссылке или цепочке ссылок.**
    4. -
    - -Для очистки памяти от недостижимых значений в браузерах используется автоматический
    Сборщик мусора (англ. Garbage collection, GC), встроенный в интерпретатор, который наблюдает за объектами и время от времени удаляет недостижимые. - -Самая простая ситуация здесь с примитивами. При присвоении они копируются целиком, ссылок на них не создаётся, так что если в переменной была одна строка, а её заменили на другую, то предыдущую можно смело выбросить. - -Именно объекты требуют специального "сборщика мусора", который наблюдает за ссылками, так как на один объект может быть много ссылок из разных переменных и, при перезаписи одной из них, объект может быть всё ещё доступен из другой. - -Далее мы посмотрим ряд примеров, которые помогут в этом разобраться. - -### Достижимость и наличие ссылок - -Есть одно упрощение для работы с памятью: "значение остаётся в памяти, пока на него есть ссылка". - -Но такое упрощение будет верным лишь в одну сторону. - -
      -
    • **Верно -- в том плане, что если ссылок на значение нет, то память из-под него очищается.** - -Например, была создана ссылка в переменной, и эту переменную тут же перезаписали: - -```js -var user = { - name: "Вася" -}; -user = null; -``` - -Теперь объект `{ name: "Вася" }` более недоступен. Память будет освобождена. -
    • -
    • **Неверно -- в другую сторону: наличие ссылки не гарантирует, что значение останется в памяти.** - -Такая ситуация возникает с объектами, которые ссылаются друг на друга: - -```js -var vasya = {}; -var petya = {}; -vasya.friend = petya; -petya.friend = vasya; - -vasya = petya = null; -``` - -Несмотря на то, что на объекты `vasya`, `petya` ссылаются друг на друга через ссылку `friend`, то есть можно сказать, что на каждый из них есть ссылка, последняя строка делает эти объекты в совокупности недостижимыми. - -Поэтому они будут удалены из памяти. - -Здесь как раз и играет роль "достижимость" -- оба этих объекта становятся недостижимы из корней, в первую очередь, из глобальной области, стека. - -[Сборщик мусора](http://ru.wikipedia.org/wiki/%D0%A1%D0%B1%D0%BE%D1%80%D0%BA%D0%B0_%D0%BC%D1%83%D1%81%D0%BE%D1%80%D0%B0) отслеживает такие ситуации и очищает память. -
    • -
    - -## Алгоритм сборки мусора - -Сборщик мусора идёт от корня по ссылкам и запоминает все найденные объекты. По окончанию -- он смотрит, какие объекты в нём отсутствуют и удаляет их. - -Например, рассмотрим пример объекта "семья": - -```js -function marry(man, woman) { - woman.husband = man; - man.wife = woman; - - return { - father: man, - mother: woman - } -} - -var family = marry({ - name: "Василий" -}, { - name: "Мария" -}); -``` - -Функция `marry` принимает два объекта, даёт им ссылки друг на друга и возвращает третий, содержащий ссылки на оба. - -Получившийся объект `family` можно изобразить так: - - - -Здесь стрелочками показаны ссылки, а вот свойство `name` ссылкой не является, там хранится примитив, поэтому оно внутри самого объекта. - -Чтобы запустить сборщик мусора, удалим две ссылки: - -``` -delete family.father; -delete family.mother.husband; -``` - -Обратим внимание, удаление только одной из этих ссылок ни к чему бы не привело. Пока до объекта можно добраться из корня `window`, объект остаётся жив. - -А если две, то получается, что от бывшего `family.father` ссылки выходят, но в него -- ни одна не идёт: - - - -**Совершенно неважно, что из объекта выходят какие-то ссылки, они не влияют на достижимость этого объекта.** - -Бывший `family.father` стал недостижимым и будет удалён вместе со своми данными, которые также более недоступны из программы. - - - -А теперь -- рассмотрим более сложный случай. Что будет, если удалить главную ссылку `family`? - -Исходный объект -- тот же, что и в начале, а затем: - -```js -window.family = null; -``` - -Результат: - - - -Как видим, объекты в конструкции всё ещё связаны между собой. Однако, поиск от корня их не находит, они не достижимы, и значит сборщик мусора удалит их из памяти. - -[smart header="Оптимизации"] -Проблема описанного алгоритма -- в больших задержках. Если объектов много, то на поиск всех достижимых уйдёт довольно много времени. А ведь выполнение скрипта при этом должно быть остановлено, уже просканированные объекты не должны поменяться до окончания процесса. Получатся небольшие, но неприятные паузы-зависания в работе скрипта. - -Поэтому современные интерпретаторы применяют различные оптимизации. - -Самая частая -- это деление объектов на два вида "старые" и "новые". Для каждого типа выделяется своя область памяти. Каждый объект создаётся в "новой" области и, если прожил достаточно долго, мигрирует в старую. "Новая" область обычно небольшая. Она очищается часто. "Старая" -- редко. - -На практике получается эффективно, обычно большинство объектов создаются и умирают почти сразу, к примеру, служа локальными переменными функции: -```js -function showTime() { - alert( new Date() ); // этот объект будет создан и умрёт сразу -} -``` - -Если вы знаете низкоуровневые языки программирования, то более подробно об организации сборки мусора в V8 можно почитать, например, в статье [A tour of V8: Garbage Collection](http://jayconrod.com/posts/55/a-tour-of-v8-garbage-collection). - -[/smart] - -## Замыкания - -Объекты переменных, о которых шла речь ранее, в главе про замыкания, также подвержены сборке мусора. Они следуют тем же правилам, что и обычные объекты. - -Объект переменных внешней функции существует в памяти до тех пор, пока существует хоть одна внутренняя функция, ссылающаяся на него через свойство `[[Scope]]`. - -Например: - -
      -
    • Обычно объект переменных удаляется по завершении работы функции. Даже если в нём есть объявление внутренней функции: - -```js -function f() { - var value = 123; - - function g() {} // g видна только изнутри -} - -f(); -``` - -В коде выше `value` и `g` являются свойствами объекта переменных. Во время выполнения `f()` её объект переменных находится в текущем стеке выполнения, поэтому жив. По окончанию, он станет недостижимым и будет убран из памяти вместе с остальными локальными переменными. -
    • -
    • ...А вот в этом случае лексическое окружение, включая переменную `value`, будет сохранено: - -```js -function f() { - var value = 123; - - function g() {} - -*!* - return g; -*/!* -} - -var g = f(); // функция g будет жить и сохранит ссылку на объект переменных -``` - -В скрытом свойстве `g.[[Scope]]` находится ссылка на объект переменных, в котором была создана `g`. Поэтому этот объект переменных останется в памяти, а в нём -- и `value`. -
    • -
    • -Если `f()` будет вызываться много раз, а полученные функции будут сохраняться, например, складываться в массив, то будут сохраняться и объекты `LexicalEnvironment` с соответствующими значениями `value`: - -```js -function f() { - var value = Math.random(); - - return function() {}; -} - -// 3 функции, каждая ссылается на свой объект переменных, -// каждый со своим значением value -var arr = [f(), f(), f()]; -``` - -
    • -
    • Объект `LexicalEnvironment` живёт ровно до тех пор, пока на него существуют ссылки. В коде ниже после удаления ссылки на `g` умирает: - -```js -function f() { - var value = 123; - - function g() {} - - return g; -} - -var g = f(); // функция g жива -// а значит в памяти остается соответствующий объект переменных f() - -g = null; // ..а вот теперь память будет очищена -``` - -
    • -
    - -### Оптимизация в V8 и её последствия - -Современные JS-движки делают оптимизации замыканий по памяти. Они анализируют использование переменных и в случае, когда переменная из замыкания абсолютно точно не используется, удаляют её. - -В коде выше переменная `value` никак не используется. Поэтому она будет удалена из памяти. - -**Важный побочный эффект в V8 (Chrome, Opera) состоит в том, что удалённая переменная станет недоступна и при отладке!** - -Попробуйте запустить пример ниже с открытой консолью Chrome. Когда он остановится, в консоли наберите `alert(value)`. - -```js -//+ run -function f() { - var value = Math.random(); - - function g() { - debugger; // выполните в консоли alert( value ); Нет такой переменной! - } - - return g; -} - -var g = f(); -g(); -``` - -Как вы могли увидеть -- нет такой переменной! Недоступна она изнутри `g`. Интерпретатор решил, что она нам не понадобится и удалил. - -Это может привести к забавным казусам при отладке, вплоть до того что вместо этой переменной будет другая, внешняя: - -```js -//+ run -var value = "Сюрприз"; - -function f() { - var value = "самое близкое значение"; - - function g() { - debugger; // выполните в консоли alert( value ); Сюрприз! - } - - return g; -} - -var g = f(); -g(); -``` - -[warn header="Ещё увидимся"] -Об этой особенности важно знать. Если вы отлаживаете под Chrome/Opera, то наверняка рано или поздно с ней встретитесь! - -Это не глюк отладчика, а особенность работы V8, которая, возможно, будет когда-нибудь изменена. Вы всегда сможете проверить, не изменилось ли чего, запустив примеры на этой странице. -[/warn] - -## Влияние управления памятью на скорость - -На создание новых объектов и их удаление тратится время. Это важно иметь в виду в случае, когда важна производительность. - -В качестве примера рассмотрим рекурсию. При вложенных вызовах каждый раз создаётся новый объект с переменными и помещается в стек. Потом память из-под него нужно очистить. Поэтому рекурсивный код будет всегда медленнее использующего цикл, но насколько? - -Пример ниже тестирует сложение чисел до данного через рекурсию по сравнению с обычным циклом: - -```js -//+ run -function sumTo(n) { // обычный цикл 1+2+...+n - var result = 0; - for (var i = 1; i <= n; i++) { - result += i; - } - return result; -} - -function sumToRec(n) { // рекурсия sumToRec(n) = n+SumToRec(n-1) - return n == 1 ? 1 : n + sumToRec(n - 1); -} - -var timeLoop = performance.now(); -for (var i = 1; i < 1000; i++) sumTo(1000); // цикл -timeLoop = performance.now() - timeLoop; - -var timeRecursion = performance.now(); -for (var i = 1; i < 1000; i++) sumToRec(1000); // рекурсия -timeRecursion = performance.now() - timeRecursion; - -alert( "Разница в " + (timeRecursion / timeLoop) + " раз" ); -``` - -Различие в скорости на таком примере может составлять, в зависимости от интерпретатора, 2-10 раз. - -Вообще, этот пример -- не показателен. Ещё раз обращаю ваше внимание на то, что такие искусственные "микротесты" часто врут. Правильно их делать -- отдельная наука, которая выходит за рамки этой главы. Но и на практике ускорение в 2-10 раз оптимизацией по количеству объектов (и вообще, любых значений) -- отнюдь не миф, а вполне достижимо. - -В реальной жизни в большинстве ситуаций такая оптимизация несущественна, просто потому что "JavaScript и так достаточно быстр". Но она может быть эффективной для "узких мест" кода. diff --git a/1-js/5-functions-closures/6-memory-management/family-no-family.png b/1-js/5-functions-closures/6-memory-management/family-no-family.png deleted file mode 100644 index f37ef2a6375d8786f083f74ad62d848d13c3a991..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19994 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 diff --git a/1-js/5-functions-closures/6-memory-management/family-no-family@2x.png b/1-js/5-functions-closures/6-memory-management/family-no-family@2x.png deleted file mode 100644 index 9764e2e895d177d88880619f7b19423c16e4b946..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 46213 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 z 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 rw4({6Ogvkd-~Z1v^LK{*O!Vg#RH~ocXj!X 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 TDan5i%it7bzW}Q~ntuN;OO9w@ diff --git a/1-js/5-functions-closures/6-memory-management/family-no-father-2@2x.png b/1-js/5-functions-closures/6-memory-management/family-no-father-2@2x.png deleted file mode 100644 index b0062c97892fc0026f78ff8dc32d193814029d7c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22643 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 WU(hHh55utk~A^`0RjXB1hTA* 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 diff --git a/1-js/5-functions-closures/6-memory-management/family-no-father@2x.png b/1-js/5-functions-closures/6-memory-management/family-no-father@2x.png deleted file mode 100644 index 2eaa35f293519fc2700c756e256675859fe2368f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 38251 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

    B;f2wz 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 M07*qoM6N<$f^fSguK)l5 diff --git a/1-js/5-functions-closures/6-memory-management/family@2x.png b/1-js/5-functions-closures/6-memory-management/family@2x.png deleted file mode 100644 index 7d9e98a556316d954ec4c9fac4bca61812c7fa0d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 39557 zcmdSBV|ZO%)HWKkLBqystTr|p+g2MiR%5HNZ8Wy+HfqdW2^+r%Zec(;39y5fgwqV3oC+wLBxQ8fycqY08auqe{2Ci!0i;p zK7f^v;O~Ng34lom3o1KTaEFH zO1Cc>DrRd)_6}KLR%ef_3b=@X-~}l$tGBXt0DGOxUFs+&thd)nM2{Xd z(NMVDA5Khkc#OQ)KY&4?o{)q4Gpb-Y_=7?1seZh;+dSPOR-{vtkV=fVDqkQ|uBgra z{kvWm;mV7Lx*`rr&Dwe+01S#4%qIX#fOu|fje`)XRXs~u?o&ot#`l`QzHt&Ta5#Z1 zO$fNRB|ZK_s3(j*F4s@@?(HAVCzHwtzSXnR0b-(hgF$H{Qt42VVFDspgUcq}y|?{v z=Z-`#PO~W*HJ)>*LKDjC>W+{9^3h^)Z-Ht}?Vqo}M-d*}_lzCn4!_Hj()-(cj2;TT z=SCR~-pL+S!i|HzJCQx!PBCY+nTI?USC=#Mh}{zE7AOB3J1Wj)J%-iD>` z*=FT6=|Gt3}U0g zAj*dej4&q;XDr!d&UCb9j{{lZ1OO{3f%zD&^BkMhMIu;ewOWkpiQGm8{lcDTfwrr< z*ST7Gv|jC7{i%E1L+;(}) zn#HW!?-#k-7dS$nj~7XnQ+FzqvvJmsb8MZUoD}(6&w`S;XmrLNI1GNO*fu%XtbSp0 zQ`UB5>$hwcq1M*qpoLrj*_wp{{5RQL(g@r9-Z_N3$rMA;>%71ZDUyRDTi^rU=UXh( zuM>xQr)-%|5z2oWVdce@=O))|Czweh9QcZxF7q?p;%w?IyM)$Sr6T@LWn9c0+}xUj zj;^<#k+PO`w-4td^Qb@9=J9APxUlI@yuLs^rwhtMoBlFs-z46+SgoF?asF}DB%X;B z9psgwbbzP4&U9y4yoOS?ojHy(8#XRBOf1MNtLAKZC>c+5#A+y%@QN@ z+%?0jPdbopvNtD`(D&=loNJjfgHwW-cR0hGJ zJZl5?*>2hsMAAs*B=0Za4h?xL56;8UC4=}Wt=PY$Z8j>F51bcvbu3X@%9t=7#3sBC z1jQM69}r0dEgxy2S`|BIN%_QzXDduMJ#sf2KDV801TrG^r=Jfj!sc1(qvT#}NDrb~ z#X4|nt?0*w$ao!Od|#e-a&%7C%2=NJa;%ys_h@$}R}pkgxHJ<$DPp^t85G~b5rICNStT=5z#N*=%Mf!+rpK1S`4C(CBpev?w5a#= z>HQ4loISs>{#ufh65oSf?jgKArcTfSxBQT`eDPUNlPugTcG$$Vlunt?x(8>jR&(r+ zTp?QB{hd#vJUCR9HPiMIzpKHSLGgfUL+mXu0gk{X*r^4be}o@LqEkFPb3UBwnvkz^ zBTosp>hJ1ceCU($e(g%aO|=(BgGm?~S5C@>c0?;)`L|--C0@=zzP*>rxqi!Ux+J>V zi&qH>A6w~d$U?N4o+Nf5w?Efcblr1bx`ykxB*aTlo3D|oCl+%QHU4P*oKtV{zM}tm z5MlzanZ%TaDhNWd_{N86_RK|$q1IVQ{#B`nH+;+m=%<`&fys#) z+lRi7c@vI9FFCKX%KM_}hyzm#`0E($V_Vo}0&ddK<|gbFIL6x+k8&NRG>E&h$A{8#(?2^MimSW{B7y}J8kR_t*3;B&u}U1i3D|rxU@>Xpq;}87H!TVdukdjj2&qJ!xSlFpgr{-!!uX`)O zW>Ch(aZ28A4}|A0wG|&_GYqjWR#0zYLtrSjs^u+W!YbWK;Yb-W1p;ceD*JI8bVH3zY&-aFg`=m1e4Ei%0Rt+zcO|D86Jw zV897<4no}!4_oWU4~P>mM)a7pI*(v*%opPb&qH4K?l_1jY+1S@%r~)iB^)J_yKI;Q zjY$xcs1%2}>xEC)D=y_PMMq zLVxH_I%a=4ix{k}kHp)=>2TeJ_p?2o?jO zK!8`ISYy6eqp$I8pjt@q^>BXBAoN}5NTOQnqC)Yi%==>gp2H-NNd!9U0C(Bt!d3*_ zrQ-F`o^4k<7W@h9vA=Q%Xe?U7Xg1t@L0NT%K{R zYNeBI`-y#GTe`(#EoLL+Uc@`27I|Gf`XdqiBRG`t3k*Lhr&@>L{nK3FvKDbzQXBBs z>#_Wa9yt%}22n*MHLI^93CspZzL#ATb-Dxt|FW^X1hX?6T$Ks{t??8lzAU*ds6 zeUI6nH`sZgg1BHiudVtT(``cA-FG1^6Y0_J(J^uv;bR#$7D#o@Ro?beQP^s)Rs6u9 zHXzne1&+rc*nT!z;=0D3g|AvTxXzoqEqx<#G#!SBFRD)y*7Lgk61mbEwy&a1?ADg; zBl~>glD!o3>3Y+le^HVou9R;!CdVx7i}_czCYE_ zx=MGhHe5%E&1=(y#imC&u4Prz+}78}mKWW#FxA2T5M=K3fwmk`rou(V*!3_cZoqdg z@2w6}BAY%k;2&TR$WYquX52r+WdN_;hK}Jhpxzg$k>Nsk)4s_#$t6XLfKcTopKDNX zmTBn{{PeUx6vJ#fFVe?o=;`$EVZ_PRa*2vs2fxFL`Kc=tZ;GV5__GL?sENK@`}=8BaL+p%D?xmpu(L7*K%>i4zDHAtNQo zxzFvN*E4F!o93p8nUpnLO=hRcA|-FTn^4~*k?S2V{WjTcBIjb_=%2RhXZo~5)P#`$ zN{o$IHc!dNuKc+`{AFOk)wW5#V{5eFY!S6UqE}&GdJ1SYyZbEYm{<}I4vxLCTb=+3 z`O4ASNdX#03zErL=!VL9 zN(H}pn3jd8twIqth6S7A!0rBICz_9KV*RGbZ$URxAuKqFM|%LmnezY@b+oR7dU{u- z8*Y4D6>%1uk@B|lPsA5nfdK7GSpUJc|Nr=PWgQ|da)#(vpg;~W% zTf9$x$FC~5$O>OU@i1ncxMRvgzG&vpA@wkT+a%N&$>D_vyc}N_bblktLKK5C+aDFU zD+ug{#*3x{E>I&-qeTP@4Yen;GH@)lS7w3n3LNex5X|-M<2p|^=3m`qeTPOBXXD^R zhWoq9gAkZcu2-5^EyN2E0O^&b5e%XqhO!SFar7_hLnIhRa@$Cp}tVte~pFfY{rQ6O2S}_b~lBAUCB^j(_$9l zMYwiqKvwoqJToNlQACW)g3IOMJpC$)J@Bc$!%tJ)<*LcGr+)qR>a>;z(vdX+Xdr|P zC_WO5!Sa5zNmz<_tP(UK{U1ur;fKY?Tqa;9r{Sv=%Tb#_OhN0_?E%5r`1ms39ogC*8KZU|@Npq^m)oJmpF zI$!dcJD?q9esCgJzh@|0utbCz=tz^qR%DbH434l=Rj?6O3Te6G3JJDp%@j%gP?DjCBzV=FK-D(TO+j$w5?W-i5J~g994{HBue!q(^S$< zg$jXJ;QlS-d2o_YRv7G|R%)90W6(5CE#LT;!R1GXsOmQ%8g0zOm&m5$AwR~1_Q&4f z0q(Q>8t`Q9Z3I?-?`y=k%xug|_pZJE_iX?@} zt;~xPB|mD>kZwAhkpk%g6*rAY$`-??v3&z-%Uim6r=@8~n)saElQ+DN!r9bgarGM8 z0k0%ASVEE0id!?2DDM&|O?Sq0F^}%wRuiUf?w)juu~Z5b)`_2gcz>92?q%O7ZJ`9U z$nSzxSJ&OO&91R`Xupgg@(JL{-rk9bD--pJnZ(K{5PT$ASjW+H`FebwkxX=gZ+o6% zGYIz{R#Rf8kSqfo=yIj~+8`=kv0JZ9nEtwt#fOQ`e~e_vBY)=p z+)>lm>-+PU(o!L+@cgys=f|p~t&uqaa?GoG!cp`g+7ky8WXDgsm0}qVuzL?G0qO( zdcwmISAs=7QYS@v3s8bunSt1ezSy4(?G?-dhw9dXAFar<l>!67q5V z1zYv!dXJS)fr7?^-LOTN`;07dfjiwjA+SsZCR{uca>#AJ?gTEy-T&R7jJyDiS#?osqc=hw zbX;a?*Aqfv_nZ$6K6VKx*|mxQ@!Ym4okfUxq5}RtA*Rn+LvO4%=g`DEbnyE$3gNWd zTzh)WU~gIBK7Cc(l~{m8eyuc*_-1FB&Zw5S9>!`=6|X7FFHeys zs;DlLl1iC9vX{#Av6m`P#q>3xhTVD*QmpgN<%n11gA9<}GSNPsraOD-_nipYcYe`Z zTdl}fJm}UycDpZpK+BW#!AcZ^!A>mQd~KE$OR04cpWQj&N;B8q$~2Zh;z4HVh&nXK z6y#(ZATO|a^D9lnEle?Tz;4E~iNk~FP<`O(idS@$e|;nPe4Yq~9F!Uh(Sg+H@FVC0 z@mM3Y{pRXa>|$cl^?b=egzzbNiuU};>Ibu@t4WM?Z&9OW!{Iad)o!a$d#)nC?t+?O zl;Jp4l8G5e>qSS)YJ=iY<&e z0s{OQi)u33$3F~3#yNp6;MM zLy2|fzG_K{+cxZwh!?rktKa%B&`q*L?j2~^y6>LFhI(S@v%_uDT}e32 zwj)cQzsWtKIgA*`;tjm(^Bq6?aKOYBL=Zx*S3dVMQT_%c6*5^RrO12+I0?oixt;Pys$pIAxvr{p@?@W*J;gc6jV#8Ra$IYC=yto0 z`${k0T^?x8RDuvn=RK5->B9X8ycraDCic$Fj`_jjT*ZXKU>N9v<$`A~61C-zU zhN^EKszfZ2|PuZBNq>p4i;`m3QIWi4ZGX}QEhBhqkc~FdW4Da1nO+DlGcx~ z_z)nJhd(?^f;Fhn9>F*A>~vA)VVP&#SOmkDrrY zl^bqzO8-$)9`u_PkoNE zuF^wpd4!gXBelMNTMDW!pWuRP&tIh|`Gg2`&OpT-pj8=lo}ixUEMVpbX_?*_Kw99{ zuua_YZUu^WhYOaW@A?N5|()$>&6RZe^CJSFnwfTvqrvkb)OFa*>c310JD>*4Yh z=B&HBBjVm{S>W0`5h2)(&lMt=%GqKvoe0(wq#;S<)?RocXusJfuT$|+o4cyBjAt~Z zYVHEV?cU?t^GV%=SAV&X;vwoYA9Xc&l@TCNqY$;1E`2VFu_w1aH}EmYT`d|3;cQ}K zRDN>2=&o@i^!qSZg1niSLtA_BFz;mQzZoA!ka5F^)JhVC5ZcquPY!Lua-b55>1b19 z=GrA~`?^Ia`f#*lt}%LxUrh+TiF(4Q+9#Y+xtzW7Jxkt`q%Gl3-Q&U{{HPYXB2V;+ zhxYCxuwl0c*kv3?Qgt6ND8r6;9}x2G6oR00Mhq?V9L-VJ%H!zda1(Qk4Pi_w5>JPBvIG#egT!gVBeb& z9=NUZYW$o3!|{x00G1S?gj4~v_|FI1-vUV|aRh4*0g(3(D{2)7_{{%OFz1v@pUI}jFop3K<55A9r21f za6AKS3!t0y@9H*WfD({UWB#%=FerS0D%l_Smi>?ItN}PB3tGz|M?SCHs2H2-PezR_*ZMsW*&lGl10kt0W6?>+lYWe84ZX>vB z+C(x`!{d_WGZZV*ZZqGcO4*XT$81XF#1F#OtfAQL^`fu34<<#47X%t&vH4=p;3pOYLhWhZ4S? zO;o2s3BE3;G-!RO2)l8Xq`(r>_XSzXr0Nx$t-`+18M~44#N5yU4viBx3Bikj z9sm!A^>mUPCzgYkPGf!Q|5?i%+Pz*yF>=Hy5BnF%dO zQH!S>E~D0~fiXXYyNQvtyi@qqeHVu0uwQc>-_Ewe2v$yF+%^uvZ|E!vW4+e_V|tQ% z6H0V&rJIC_K_f`5=dDv-(h$8nA~PLc*iL(QX|VS7;ucpkN_imsWQ2HZ0aJk=Wb$wY zAiWvz?3>uN!9i6mahx0GPV9GS^OcfTc-!n5U!G0|YHCYLb+k8DQpNlfpwEF+vOc23 z-_*y(7(5RdglOTcIvKsrel@`2;at$vWPat2s&=(s#Z4CHPae$3z|Q+KwpB*H{@HHB zPx6~`>};lLpp#~Txn4x4DM~B0*covohwVk&coD|0+3=G&v6@^B$qU!psx z1e@Q(Vto5*0AjlLns%x!0rUIOOO(hP1JSS_h6c^*=%a7>1Sv=X1?lfF|M8lohAcHW z&`A`EF)fe;*^NC8xl}uWq-Q2xqTHRL8|%t`b+5rlTGB$u6Hn3#%{2d{K0h z9W8q5k8>f~oy$feqK~cHoaUv3LPoUMGBm`M(De*V^u>8)h$%3jd`j zK672l8}E|H5Kwg_mN*%&xS7SMw_lTiE zzMyO~tUibjkPa5Fnd-%!zsAd0Wh4ySrbX*Ct9o8s)mZO+sgTA(MD-H_wZ%wuoHYI9 zUB0u6#mn@Yq&Hrj`RH^k)F+M?7U+dN90Sd9A!q|ro(0!pwyi$lUKE~L7p zE)^v~?!P$B3O&Rdu?ejasJ-zWD89pa+VfwLo?AyAhb^4?a(QorL*OjRy-d%r`#A+k z%*in}F_-W!B=Ablnf9Ki^EX}>RS;6uSdrl_*X>N7$ohS8aPM@P``jYJz*aPSF|##U z4YV&m`&d894Vag^NpcOS^$qaHCgk1b#iGRs~Pacm54b|;@E zH6iJwdI$vT?wu)Ci|?Qnq&6AkauEIn0LA{qN1ih4du=7C{MGrz=j0xWc78Qo-t z6<)twNq?KGS#(Yy{ETcUY0-gUJvqv?eg{(66ZZ%$PgZ^`c z_HWv@FAD98L<#=0(+1S*4;EGQ%g5`VtL9cdPHtM+O5qfV9xO33e0sT+z>l#6B6FQG ziKa&6pf^w&Y9pyqRNe=%u(nikEXk$H9rNGpCQc}c?dA#ksSdlYO4Q|59g!z{Z=ug4oSV5nOI( zwRwtK(ph?1UWV3@%WOMgO^hbg&9r>J8%%VA+BVXzSc900-Gg$AaaGaS&O@cvYEKAV z()Y&*Y^BefUt!eUv+*s0m}NA-Jz0K@fqzNk4<2L43T_(67n~>1Sp!@Ty!(+k_t63l z&DRAK$n6*NQYdMmXs=F5zeAVlPZ^sdrxLcpmwpS*S?8Xozd5ttx+WP!DbChoQZL@i4K7=9oVSi^Ian%f^5<54c1R71^iPawkwC-m5Z!CL)JIZkb1%=L72n&HP z5lmQ6$xAV@3W`52B@)V++^RK^z8tXk^4qYb4YgIL&kBiMOE29?TB4+}79Y3ZSA^Lr zBNwcccG34wLg!Qpv@_5n!gzeX@GY~J-2dl_XakD#3vM5gAdnb3m&)iJKh3w17ksB( z^?_{XbQt(=xXFBCnE(g1tQ%Hkgq{1)7E{yH7%gg97j%9Y3gn>i5^b zvyD(sXuz)+&ioYeouU`iXxS>A4^OU@U>2;)ZZ-GF8dwog5c`QUDi*g>zY}k4nrpqK zdp?vLHuvKN!Tg&BP;2M@A=?4O#J^`DmZ&G=W!o$5F$G}^vO{~~6O=lanpM;=p$e;N zA#sB+lr-42I9oM(#MXySC5Yivv0)3%Vwn{T<)pFF{&KI2{@MPzIeAt7%lA4l?M;qG z>(!2j50>#A9!u%$#-$-ot$h2Wa0YydmGhHUl5=M>k6vD=Nlgg7e#YJu@YkD-a=B zIR?ervGJQjKLIj~o7K*GUeWLJ>XZ4Q_aR18_Ff0D0Hn{V0?@n#oiXm=R{=6K@p(Be z|LFSZ+Wxh6eH_+BqI(dwcoM?#tE`M22p`km;$2a*w83S11FA@QE+f&F| zl%uQ_jVR_J%uQ1JT|ij!HT%Vk@c#PSNAg%x+3hkF}k&iJLEq;C=iQo_21 zSSra_5Y&aMNBnW@6pj=-3n?xOh_eZlL7$W#YNBU@0Vf@VZaf%&WVCC|E-G!qMhlL6i!PaE%O^)I#?j$b`QV21+05Nq}Cn<2G z0tnHZ`@sd3{`CSL6D$zjNC8UcrA7Exz%+onXjWF14Kp6hPZw)4Ddx@7WUO!5pdDI4 zeMF};*eRfoSSaT6b+bc7Yg{0Z3_5{_Y<#x$T=CN1+dVAoPf<~v#^@!6QvIp z$mWI2fX*F6gM9%Bt+A-Synhu{!eVWOz6YvTbWVa2qz87y2wxG&l}UUyW5tAA1HSCC3qCB$O?l4SuM zz#U5wMdE;>%*|Kt@^|}pA(#%eW%`6KM);pB`9#R)v)&=U!Misj;xg!oJ(d$(FPAB? zJTD;nuk#O9fS`TQvxOVe4ZnXTdbDa3@_|@-B&c}`$Bhi|US~<~^;gpZitPtQcPot` zy}4_6pKlK29HE+6Kxid+tUR!Kg(Kwz9IEVGPPyoXm>vr)qW2dnPgmylHfVK-J^LMp z^*YUu>%%o-bW#>d5xxb8`4a^(OoTtlYW`=Epo@l@&?~@8k$`$^^|u~d9zdpb2Mz&eR>T_EV5wWhB@4uChq_rmV*?w*3{lFk2MH`KG%GchBI)avQhcbggMXCbEJPXVByXqRvgSXvl{ao;GN3FFa zDeET8QBcOW^kfwmVCT6@s|wh$KIbXS_xss@dz*1b?pSKEv5T;F15#}<(Ce>85dR7E zpgFLqq-DMtohK@``_TnDl@lZE%A$nh$-t9TzdDE&BiAa!Fd3LA26}YVb))5z3l(mI zny2sY%(kRyu=aBZ1)Qn{s)HM*kS>8`iRF=iK~fDQIzu2=A3!6>Jqg&QLq$)g&3jxt zwlMFuQkzvU~SdG+^Y_Gq~G+%icMV+2wP^&+Od^gJ6w#RC+mSdf# zFlm*W_L~#|F8mvX!q9{P-b#nOZZ}C^gehM!QUbvdljU|`f3f+Ig@ggN_GqDu^r;{))EZfAndFKquW!H zrFJ7ueSck6G%RySJ*4nXT~{DcgD()fJYEuwe>Q}9BFK6!#P_#0JL9KonhYskDb9lo z8C$eSycr4~{SQ<54%g4rIcZYZI|F&rG!y$0IB!0rP{>eai{R6C%^!>VCr(mTg#A)4 z)f>lIC__vj~E^FNH#!vANvT(I$^l5zTW)sx#Q(!#_E1U zDD}TjX2s1>sjZF9bt9Dm31BtAsJ905IwB3_`?xiK)>OJtsl?gZLzX?8`QK&;YV6e? zlNQd{9gkU-S%N1gX@9ZerN8}>LsziggG|Ps?PDoKK#9vlWi(F5Wkb{V$@PL>Zer|P zoAy$Rv+c4|t?RE|$;$+USNpeI;kZ))WmuC(oX=u`gSoIix%g`jsAW&xXcmL)|8~Z$ zn{|-?j3(5A9YtSU;B=mntoT6$NKsM`qX~z!MeEFqaG8p{U9>MbN{rk(5gTZR2w;4{iH5!w{4My78ppI<2R`L zZIi)QeA22k@Xz>!7naQ(=l*E8C;*Lp=HcV8=Q75(^tlxg#S$~=15M_EZs)Y}WC{cQ zFh-I_raVLJjF1ok4242uYDLajEkW%E1coO2`KLi@GxNPU=53T_t9RjPV`}X+rpapO z_Kw3WK-0{YF{iex>iF}xgw%1?8@T0reKdzK1Kz{{eaXc~`ZCRi!L-W@!(Bn_mEXddM#h%4+H;18cga+R+H_Mybz}~W7D7-a6|bUV zI38XX%_$u+@(Gh*`pM>{kRBRn72UlcPyn#)Dvg-ad<_Az=MrNlttCp(SDl&p%{Ngz zjFABr_j7fML3wVv=^qGk=-F8u8v_GSqza&ylOdZQJh-U?p<||PBI0py=ox2JHHA$$ zv}|9CV-bBzpB7;DJxb^B;SyE9GTx-Pa7`f`H<~66BbEMJiE;C_`)yo+ivb{_Yu zql)$1$V?@Wa<_@nwf_~%6w})n&H6T#`7Rce5EByGb==9x&3rd$p%lf?oi|!3i@KoB z1@X!v2;MDj!`Ar$-E?hUx8JIa>}uAK`fC(|&0;*K#s!s{XV+S>BLZVyLH&=pF z6T?cYin=cqj+-0+k9qNwn4m-LX%LsXq+P;s-3ywRF68;g{I01kNO6dV>}P^qkmgRT zCRY3?g%7X&rf7d>GDHnVQpEt}&LVfX#G)i3fdk*3maT}zv1MoSW1-}&C* zxWW--LOJhizGV-1@37K15#CN~&VUq7+OURPex2ORZk~rRw*fZ@3><^H4WOcvk2eau zu;MniC1kkqp?jpFtm>OD1vhk$)>oujof!9WdsDx^$5NMyl}}*quPN2ur6Q?Dsy7_tMaH+aDOUNDjjYJ(Kjc{PMh8e7RJ+>ns*|v9d@Q7NPj>UaU2pKF4czfW|18( zq@%h0IyKF`uM@-yL%Y#Z8fcH?IsLn@j)-&W}X34WO(uRO)T zf~D+*4Y_!8t_kmU_}UM+hK~=Lnh(=fW(((hW~rzWcR%nY`8~WN2=v$GmzaEdQ7jqx zn_ZG4^Y*pu;y&+|@jm>bjdL07nmX*|sP|&vzEY4JG?RqPaE;Q(?_P>W?8X9FI|HP4 z94CBCh;~NQu>eBPQ|grSetq)_gQueK+F?Ohz3b@79V{2?w|LfKd~}A>MV7UGk1A>1 z4I@17PBp4^!pf6!DE4_A@cDunTCW2(306wON?3(-Ga@`wIpJwKZ-i-L(serbcm-Hmbbz|e7nCB z)81-G2ZF7Iv_LPqoK_+Z(npjE6?G<5H|d7U;V^2Y@^ah~W?TrJzo2EldIn{HQbx;l zCz!HGDDW!R_M$SFD`EbMKuBVeLVh7=&!HbPF$krzG5H3IzFUYR6;bj_OYOawA}=6e=D$;5gL z@Br8KX-17IC-^0zK?Mm&Y3xHk$QPAi^PYhE^jqKlZO|{OC3(@?CTQgmS3H-ij2(*C z(HQbQZ^q!_;f~{%6f&NmGS7x}P(@(d!m97IlfRacxnR(}PsS0(0t; zgxUC++aQ7AIY&spbsOM!dgxcl7lUf& zCfBP%{}oWgsz$c7s(5mO+RyjYjA$qxPhym6r{1~i2nYNN0Lirxx#KUIyqML(TS zml$GM(eW9NbSEM@_8=4O+PzHSWwO>2G|9;*M~e#$&W{CWA}1&394ed1BdAvKS@DzS z>-e1kDymXW){b)Y#n~oa)}l2bCePBZ`7gx?RDi-D{Rr~|qQZe16~lwx!O-iUR}5+( zoM(G$o;bMvr7fr@8o;Od-1g*c{}P@R(4&mYf8N{!JQk>zr{hNLyxPeZ)>2hypX5A)x`f6 z&%^|xxuyUa6QuG#1S$^UNu|K`^*0SMy&M?~{1q1AV&CxxA- z+&Mx#n&6;!84I1j!^kv_yE(w1EFd&SFFe>uxoEg4i>^%;ROtjepP{N_(fU{qr&!tD zq}QHr_4da|;RFQGR&t>M1mJUrF7B~W|C!{|r;ZaIC%;`PQ9lMoxdoa}x7KQV$Awfl zKw9KrZ`BGN8~cgaO&zC?1eLR@?wL`K^3>+G<-SsgS||t9S*8mZ1_Hp)e@ZvIDLbo+ zrvN=J6^vHNS9IV|;9eLeX!vz12&6q%wg~MW&d%bR(>tD{_Xcj`6mTq`fp4>I)kN0M zlyqi%qxZ84YW_qfrj4SnkelO&Gia}r(=mIOpTlC|=go)^lvu4Hwt*4oz>W)j^?ZMB z_vK!v;fq&$7tbs(-+dG3-NneBX$DS%2)v2&6W?X#qaw8X;5kD0;2sXNkd>+<)O3?T%c6#+Bmc%AehciZ3xnh6+rFasT=gW@{AI_g?Iji6 zTp*Ny88JeMV?O@EbQJhp{>hwF&Ahp8>PB&=U!V2rDd)Oi+fGh=xT$mRv%POBWyHn1 z9UZL=wVW>5W2(C4^NE%YLM{0l2SWkp2S&btM&B~0V7R+HF?Z3k*n$2M;z1F_Oxwc& z^81{OrAXaMmlzZ_bd>;sIw+=Cw1N`^&zKgeMZFn#;{V?#@;c%XL&TrSeFYa7K| zSK9p|>&scCkmAxqq@Q-#;My&@cff8Q zYI;F`qcLyXj-CIA1qF?GWg9}}s1DnWlJn@kuqie0J=*tCjWHg$n^s_rOn!e80U^Yo z3XWHy@XN)h80@hhR?obIV5Yl1Y&PE;U_DirecKOS7wlYsVu;-PrBEbqt$Gsj`Dm~A z2%?|JGS5k$5MZ@gZjDbc;;j)o;NDurXZ7yu3EzXYWJU%LWEttuZq*%f)G z+Lm$s1)N&$&(QmRPU0bv8EoazT~1$R>7t(0c5c3Jd;XT~?Vy6Q>1}Y0otT*T%B0?A zhD2@#uMfyb2S71)-Yscbm1r6Bi~DKcVB^Gu;8nlqotm$$_>a*2nOSS=9abMH!e;@q zca&cn#xN>~_#6gvkaYZd?OTV8?|=7D-)3SU@J$)D%+YcOg^AT-mtR@69f_9@wu%F< z9teXom`kro`gii~9KqtceQJniMj#R!S~w#bbNK+a%$*^B?QhUbSlo@RDc|SdZu~v< zQFbU*SDrHn10^>rbbigz!Cf3}V#cIh>qN0bkI#8!l_ox2+9DUnpp_VIbx!1Np`;dt z>6f@SQc`Qw_O0cSpZNEWEV#OnX{i%9f`;LRRZ8m^sM*{34^nEnt_{1M`f4y1CiFhr zdIN-Z*U+aDHfkEtTe^TKN8wR9W)S6>Y-O4_PqF)PS*pW?)xi5e|IgDMR#Fvyc|fPz zvNwtpla?l(_NPG&rj?Y;=Z@jNmSO)_b*LQA%A?3B0uBg>#HlT`qVL`?V8mf9IUKI( zjW)f6QdTusi(#7)l|uLL_m9&}Egr)7qJZzN4J--k5&{bJs%SW>Ba2@~;}wEYDrp&{=3*CRmz72X zVD+&P8XKznF7Q;-;^!KE4G1N=6K0X%c^{_-OkLd@NZ7_Mv)4)@(b0t`@~iB(|NFlH z&d7n05@LGxDebb2GrT=@4p}3gDKRVa-u9%3YA3^vO@<(hun)4P$*Yb~(eVUT&=7U6 zP3nm^y(nuUMPkPrrQFxUORBro-of;-@KQ$X?$HoUq#>@j^)(?W7E=KED_IG3m)=~I zrj3tIDPiM_0>@>|-Oa8LJwsleo}RXP_fm~TR>HVX5&JcI#Fr|>5Za^G{hLIR^w0_@ z+_n}v+-=8KtKkmIt<%wi{h^HG@gj?J zVOQ)#?KeTCZwf*eraQ1RJr0ze(&dXyi`Qyeu1#*ufkBJ3`sasL&ezd*JVyV%5wHK9 z8>J%r=Tduq;D-vt5R>fD-Em4g%9+n?)Wf?zZB!)8yGIJGKW=cSovZ9-Z{H$|k&f-{ z+-eaTCTn~4b236v10aRghg(&bj-+{(d4H}wk`^OmR0p}ChdS;6;YV27`^P{%YDp=J z=gU(IH6u5!;k(;d1sa+pg63V>!v_5J~D<)vXvij@bBZH$?-bYnB<0p0^`=L97h1G%k z;36(uX3|_!@tJr`2uYvRfe8AeNorEBY2H|;*0T|Fl;>;)+FkM^^305b;{7@M?f{)L z%cc5OW0S!w$MHkoE`fu6`OY_R*dMx z!|bu3GttbE>G|L+KGzx?2-%OyxXeJ`2ZNV@l6hCNXhI0+&;DJ7Irtp^YBR(9{otSh zuQ|`Y2H8Z6pi6=0R^qwc4{1^u*G~cq=7VeVTd9+I^(GQaO6;zWXE$HN2S+4}Mz%2d z;r8~t#=Zfs(Ni`ei>qjVT9P8N3N2J`aO!Yx5bKOyb{uH1E9Lq2!NovyN8??SE|&DX zulj9!L}EByRNDbdltZgrm*p`2FJofrINI4fi-K$YWV0?;k~zi@Jvl=nIhN}<7HtC1 zm}Dni6f2EwsqZ#l>4XYo_HuOuerwC(5nY+nt;+WKr0ThX93EL0cNw!zd`hjci1us< zIksg{L?Vsn)w)|>6?*-&Zq}*p{AancVO@^5ebac?*vWq4uj32k*fW4Rp=5*~FlaIT z^UQ^2SZZ%|dyi&G4J{&{;AvBT^U$ZR&x#xSWL$}+MJY|^CSD1QCPkHV z%Ye^$^--`=c144|x7^R$`qoi#`;_fmQyfA&g2%tQ%0csUy@zEVLsNf6->d#YRI?$* z1JyK3K}X0M$<6)ti4(Elw}!o82etSVyv&bKrMq5JvodB|lI87J(7lJ`)~ZAtnR*3k|AKvMV-N5X66a$SJ+===1si_$-- zo_1&D?47N6PEUfx5>srr&h{N1~tZIlQ(nj-|LNJ&s}*0<#I9z@i`4v^C4HOmwKMc?Bxz$ z-S+iN2L zO@zlYv7r|QtNWuo4R!<(nCNk-2qtJG{- zbPR4?akm%g4O9?*Y?Xn0Ilq7PeSDWeLo?Jy`;_{Kb96=uu%|+=mu}}LvE8Uk=`}nA z%x5<0*{Eh&iYsj=;`_QMnXMg9x##xH-<|ienODtj_0JBLyOk%hqnom6T#m>_x=AE# zA_o$!x0{xsfrQRvThlrBhnm-0z8jw35-j!mx*AcG$_cK=DU=8YuSe1v_&mvJHx7c2 zyTccl!}R4%@7(*YBZA?di(q|v@24D@jNR9P|G0rJdJV_=*v3V}k*L$bA_wE>_0fG2 zUcdRl`a{T0`P2aQL7VGZ#fX`#tK%&P^DKt&z}3duf>xx*N~KLE zU2tQ`77ASzyF*meSuu}{=5(F-8(R8v9E2;d==EJacoCr?!Cd;swk|T+eY%qQF9wua zA;yW-qSwz!C{qtxY(a)yca^pt-S7A2NrNs9IJ?G4R>X<#LgP&HM0(&4WE2kuqCA%}48KJYtBxm3Xvq-^EH$2R)Q&(-lHvEe6 z`Kh9o?`mt}X`r1?x8sL}F@ccX0 z{|nH-Sy7yI>yBcXSp!>gcLQ`M7PrA_Dz2QkFaLUIVFXuD;+smvbMhSTwz2vPXg#LS zF7?NgvVc?-cUuE7nw7otV!=*mF*;`WiW=BU%xrUB>?4&@Ar4PS+_g|jpk9MqMLOF1 zaaOs!BE}@%nsgfOO1>QpAW&{{#J7hknDb*O)$EJ6E`>o^TNXnM4@wyZfD1N-wP+(f z=TD1Jh3X^X;d+Xn?{H0`^ZOKnEyG@gW&K0iU7_%jcZVjMsBRE-Y?5J9gRC3-kjBTU zdEcYB?ayasw>(5Voh+>f98s-+ruLzJ7}J)!=O>_iO)4GH`VlRoc2(21%9DkWd#^sd zF?IWloU_)_&lgQQ)*|D2^4NMKtci$Q^4We6j(M_|@HDL`zQ=(Q*+Jk99$us96E=ZS z%A#7}NbN68jF5+2fWLFc%6EAqk^c=8C4v3*?sEF`ny`ru0V--Kf9;tukEeb`+Wz4+ z^8V|i{wOi&i^+JGem&#xK@H@r%l37X#1{J_cIvRK7C)kWh08-drDDHK!<|_z4>2c} z4v}L@BLHALlmh=HxY~OiUyQ-g!I1Wdg7Xks<36ilqnb)BRw;L`wV+%h43h8=*JPGZ z#(*drW?U#>KRPXLjn22tJh>~gCo^{zFRus|w?t^a zf#;XGfKc7g{?28$^xPR|W`eH#fM{Nr_qlD^?|ng4LH~y)54zf~!d$tNbNfKv3m;Cd z4E-`=>n39s0Vd^b!2v;`j(y#j+7Duf2OFA;k2@a4WeOulQavx#tR^0M?c)62 zCoNvWvlZb21(b^Vb{(2@ziR3Y?VVeDtgseGdoFcpnsjOqiuQP{GIgQLWLkA%T>uWE zQPfE@5r41G{;f3TA8oMQNVvm$*ZYmcPe|g z(;-IWa5*z5bl;^zhF!8?fUmFH5|38>X%yAP_3^IA!^J+aPlof-#HO)L*>x#+?b3IH zGa$cqUL=kaTqxG8Gzgwtaey1e?0<#F#Z<8%({uDAbd9Ck`cZ~{5%%@5((f+h{_^(m z>yz%-{q;Pkx;65isvD$M3#BfZrkjv&wKx0uCKIA~!+jraJo*5gtYIzM{es(tFwm;~SgW9Mb_ zJX|bx*M-YE?mJqEdZ8E*Ejh}Oua=Yg^YiO|b&Tb8sUHJhJlIS&f_{llN=??crFcHl z$xEwFYBy1w{gvG`7ncqV2W7W_s%yB{5BHi65Y8WT7Y-Epu8+AaA%ndZ7e%mDQtvD_ zFr*e9mhE#E&BTxRrXY)y=UuOdmlDXZ!7yNjK`z?u&&v+~Rr%M{z(n@F$!`u>7ar9) zIcODcwPEv1wFoFOrKzz@O<&!&5e;5v?{|6dynF%KsWS`D4-@5wSJYr>yzNY%tSsW6 zLA;mfLge2;&Gk)t9>Zy{O{%InoVAKhmJ?y3H(3x~~IC+Rir`8&0H z5{3E)LfsZ2OusS5t8J*+McsxW!& zqJG4`hTbwl9Ifpg6tB+4W3iDu;6M)+F2+?731o5S7aiU&PxM6>mxtZ6D_i~m^l{fBEr1IgG)!j)eT zc$Q#^Q<(b~yr@p58j;?a2mn#8tX zSFXWFN#L<;T|YBZa{*1ZEVFiKNrxGPYoI<0wCzefuTEX_ZO2*omFIi#ROI+pue2ms z(-YRN>qn!RJD_wv(5gCTZ`O{IolADEZDRlw&6$sWR5>?jeAJoeo1+C&!X^G7b!2v} z2T`HNC|>h#+@;?+iH>E@7J|&!VsNW^4e3024UFvsQ0;4roj9S;VHn}L9(wMLv z&kYWej=?CipA&%BKmeQ(KcPBCI7Pk=*dweJmZOl;+vK_5U#< z1!M^pK-}1wK7pi>TwzO<`P#VYo7PFS%=G`a}fjt0s;Z&-TmMa z4b+-<Q!oZ0>@<-@$)(q ztOt70sqIUY0BDa=wlXk3QTkYpwr$A{|MXrR6e1s>wz`Oukn)-{;m0uG=Ut672uW11|WS{*Ti=?|PDk}>Tdu>4&^0K~4^ce`EnU-TCU;vVq&l{v_{q>zH=yH%j|Wrz|s_-E24KHPiX z`%fll9SVI<(+?XG0ClpZ?W5Yn`R{9A((!H#&lV}aHNg&@sc1_O&B_AA(CbOqL!)t~ z*Db+K?%$v5>hy*dE>0Mr{Re&VbpuNg&iGC#7$@JHhB=k(!HFhHBC!5Cdsg?5HrDx| zdeDJUp^!oMMq{tGPJvKQ_ICi@{ObK|li~jiB`DmZ$1c((p&HUZmqp~B4W%WlfQ1bJ zX%+u4f#Qxbd6H@CQuuS4iRvAimCl&RlECv70tNC(58$-ErfZj*t|w-!^^soKx zwKsSuN4G?C3+*>Qe!=+Yzx?_SiKXTjNq*V!i;&$Errmt+)=J|~+9`Y?_}3T zYrDQhSiS(DKnfr%wu2*j8D(LeRw>(bw-%(o7Uv2!%oK|#5H0)}RAA9dGr*B*D8d-<_M1$uh*7@&qY zHulg~oKC;eRAFbHy9hv;*q{v~&)0bf`CGFTZR0La$uT2U9}dV|*fd+tV*dlU(|<4J zVErMP)7BCfZ_V_hL!ok|%oWfuL&p6b0zIXB8NnvjlK8!UcQ}CQ zJfyy^*ae9*;?ImQ57y-z(=o@R8sEII^b>;aRDU7bU~a?`FPOb;(s~E&62i6w;=5 z_hoSxI9Z=Mm-Zh1gL~OSD>sTXu`4>hIiej(;APnyw=xy>DpiEg-^?M?@8(xXE`S3Z}zR-pr=}hFWYyh zYjFLJkQ3rIcfYst`sPvp)-OdR1)Y_`#S{W$$? zW%2dUj|EoDm1`52rpkKjeh|RwXU6o#W3rKqc@gi- zCJVYnQ5fL`#kB=`W`N0)0}hY7!gffs7fY!P{o`XA zt#fxg^+NWCaaYf$K%@N=b;hQx4$bk{7v9|gy#*DjpYk`2>rFzqC5w-aRV&gf&*qXH zasDZR=V3SH%xWm&V*<2iV(H!04(qG13WJYJHMiOV6(fC<@7{TdW0~5nFo_3;tGq*18!6AdZ@ofdvfIizg{qYs zE&m1ZO9RBwl5i!`g@fk^9MP}ZGrr8{l{LjIWm-VB?GTifTUbhDVOa`u# z_b1~|eVk!Cwxy<5@J>6CiTBAb7z%D&*O#9+U=_{Y|x zX@IRQq#Ee8K$s7-41lkC%AN|YbzL+AcY(50Bl!PGzV-^S5PmDLcyf5nd`en;(&$a@ z|0USbIy!7%Q#NY!Cu%WbGpDHUs`udw{*Mq9c z<$;qk9l<}Yjqenamx^G|Vf@yhbAHz~`Fpp0B^7v+n4<~TS&L;(&7cSrWPkp+sWXn! z>E_=0&gE5{n=>j*FIN@u^SCQ~bAVBh{Zje`$i|pOB9I*oB-mOM60s%+*;|SGb=Rb2 zGlRuzA73buu6$m4O-=H)p#%`vVUU38N?%H<0tI6Edo8Pf zY)^knnTD%E+x9KQEZd^!;GuF8dBW*F5XQ5JI*)1$q8%z*=vFuI7j|gxT;;Nf#`oQf z0a4PeWkgve zpo3eY1Qfk^yerLK_mXX4-TIyJOOCUyB>AGw z@fuGw?;q68dSLI>qD1y z254pfqr&TM8y523#xPxDc4n2;ifFThYEL@8JQ96+V|Uw1u60tU8}s+&0-WQ^Kx}bN z4?&M`!CXXLRkb6OYNf|f+)W$q_SW})PI_Fh*Mgp=!Ey8t<;1U0H8-M8O$Lni?iFRB z&t_YLQyt_hedhRBDee@hq1m%;E1svbP7}O~)L}^E(l$8eTD2LyWOI#5{WP2VNkl8{Zq0Wxv2n2B(d`oNakyb5++Coz zNq4gmw@+PvrRijNW1oxv=RMy9xXB2kzYVN;nt#rg!D$sJ7^gN_{xL5&)BiDAJxIX ze2jPBna@IY^G+DL$GV$$kI4m;|H63RI{FE4(L02tGdR?Hm<_Ek8a)`9`N1pN-&~L> z1RA6~w|=?l8*aaSCAk&<6DPmO@)ZDH-tnlH)jnC`d*r8b{hXXL>z56tAAg*FZC$EFatliUy`Nq@>gm!@bV%zydq}iL@6RN#1zi1En>38 z`P`kKw$NSm>!uX!IyO7qbZzujw)bOrA)7x_K#_pCKqq3Rorz=-(*A!^OGXJ-6Vg=k29Kx&}=Rh>gck` zL9{jBRI(inUQ=`ADKm3Ud-}(0w|Uv?E~NmMJw9WvK^G*#IhsxjXneL0QZDzPaH@*+>s%8~ z57KI;Opv-hL>R2_k|wM3C|%7bfeL-Mn9nRm!!xQAQSwVw*Zm5Pz3Ev95`Iy@Df99{ z`pAam-ytOWKwwVW!9G6j2Qz4iE9K&WJwCLB+^ci1h5oxmfaiErE}QVe)DiNkYkQ$4 z!$%_vjPXY6-^J-w9$H$mS!EAG#LoL--P)}4yYs=)esF354*B8!Z8tE23-b@SmLN?r zv1=k`%=?qu?2jNo)p$qY91f5IG1lKBF#VDMQ~?%MA|rD0rA2|K6S&UF{iDoX`eFG- z_j50q+*EZ;z>GT;NCWH4q$bzgcY~2f^WOtEE)O>9!>-i4?XSl&9IutrdAFAx`U|?x z=Bzd+RSk>i{Zzktg~Yp^ESA;fqeIA)WzZ$Of5_R^1(@M>tF>hmK6)*qB-Iie+-C_V z>yDhAgBfFz%37{l>iK>R@JiaYezE?vi1FjO4#au^zPbIk+0MCqZ&LIboc0u5xPL&l zc=l0yL{>w$3owSMIRin14z&NW+8YnlO}PAxl=2hq5dloE4RT5`ArpI>4b(OJ3Ha&7 zt_U7H;Ic&rL3h#2T-E8-9%J&!9vpwLQNWjJfqIx=0F0UaY1WmxtL8?iNKWFihip)* zBXwDSySg;5n0H|Lk{J6}bp7x%_T2=06ndlsT{?0eGyOlxO2xt?{3$DAog#FxFiU8P zpjD!r81<~QAbs_H;4Js6*<2D--Y%4zb$hl?&xmP8=lH*!aL`-7d$G3IIoWUL@!KT} zASfJQIY~fNMSCcX_QvY+7OedE#Y{&aXK-vg1@EFKmw%Z)*eoq!y^46&RB~BwGsPs1 z9Jb2C4ntmlo^Gp2_5LwouzhtfN!_Dx_>@cY(oAg1tp?KiXyvB_h|+(l)uaFQ8V%t z4te}T2tkl6UB$xp?}hGAFs7q+YLC8lKDjlgcEjIQD4)#{9;|$f=F|!slw=opKu1$(QxbK$vPZCVBsDP5KG|whL3eN{W58bsvq0CLca?fI0uE5(65H9HWnTW zZX^baF+N=e(xM5hwhidvUr>NmA!iips28{yCP&*LoUWe^e0rpZtq?X(8cZ7CUZE_W ztRn`{mKEj0-l59HB?=jDfWB&9ZuY0433G`}|K_5(M;F&RGcSyGfg&xyd{we}9N z$DqL^3!xoNB5$fMeduVU{;t*Dw)~l0q=h@!%7T)5hB*bux-MS()uy*EZg*nAWjP;$ z<9icJ#$9%_tMd1&w3{DoYp~?9#5=^m3Z&YgN8+O^iWa7hJx{pPx+FE?3>#LAsKPI`wNuDbFomxkgC^LK&8s-52~Q|q=7 z(CdtU9c6(rh^j5p20Ps=9)=&CKOc}!Z=%ZSxK<(@g&1sevcG)%CTT2!Y>)87FzVu> z?bcY|+18sWw>eYnROY!&zq`Gs%SJeAKy&y>A5%et#!9#Cxa9K?GQE8>N88ECi#=Ps zUD|hNA~c1z;K-?|^y~W1%^*3xPoN~+MWg&m#l`_QB@vRXKmWko#8>|yi%snyAnUT5 zu0}|00#gSV#ZE)9&0qCrh|@`(F?U8sz+|VRAdLta2rHEBx=N>64VGY*jzCWT%RHiv z7G$CPFFACqA8=F=+7cak(HE`AY_jf4m!7J!JB%K$nZbyq;BX9g7n7DC)z|6weGv&u zA5n2E9coME8!*=Pjiv&G9mtUI>k<@@2@8fb(h{xGcpkNKbMXc5Y$o3(kz0SfCVM# z1=Yln7GA)5S_AQE6OhEMR6z&i^PQDXoE6nQ3B*KPA=uYU5Va!DBqR*m&0G=6O0wxx!`EXSe^fXq=pRsK8oW9v_vro6<+qmDRWWh44(Iir_vk z)c>sR_}H#GtU)cwc zHkGuJ59SD;~`xMfKNj@s-;Usw}g7y2=X}Mx8|FaP>A_KLxBLj3Hw4ePytS( zCK{WO=>Pi)5%}uc7JX_UTMYcZ!T%apO8BCVstih}A^pFvgnK+7nKdl;d6e`2{-+^# z1pnv)5{#dsV=vDtn{Jm@Bg=02Hl3>qTuH|1xVntS@JRIy<)IyN3);dQV0j47509*_cBdO*bzpLAMDvXB5SA|NT) zc@bSP15nn7DL_bapKH@)cO^%e*kw}ePCNxvVhEy@-Q}H1sQ_bjg#az)dwS7l&X`PRWybf5aYOk%eggjCVeM7M1y~auao>G3 zJX`;Rj~uxTdfK&L{GyF2={Ng++0OHMc-5B9WvECkRNoJS^8BG#|6-4gup7VU=x_V3 z4*?!j*X0PzL6zpak8MZRWd9YMLAD!oe4nd}*iWpBSpJiQ6Xy4miwio<29%yV`p7R$ z&d9Iy+BrC7vgNrvJcKUblI)wEp}VZS1mY80P4k@NXI)#GBgjNmQ~tAk7{A`y8J0qN z$1~g@hn>odCUiPw^T19{>~Jce2k~Z#csF(GT~{(i;xsNuO&?x(ahC^Xou=9^WwMu8 zpLYay&3Q0u{It1Lc^qnbw2<%3!0Q)BZZ<2UY3_7tl3@i0_#iv{d@c~<>}jB4Ls6mC zghFH8!(VF!Co~0$O#j3r1sx?OR3}(9A`wwUKb$D7Dq3Q64_LZwtJE@!?!k~u_6<(@ zodh2s9|vnmZIo{h*pq}vHO;2KBl>r0voE-Pkw(pFXU$ttPEEA*BtIfyW;U_|b>dcF z=gaoDdlk4O3KARa={?(Rq5eT>B>Y<^CeO6Nh9QbKWC7%ZqFXl!goHO}&?HwQsFR4G zJCcG}WdND%3=qYz>L^@M;y*CaHIV^6{2go<>%>?G>pvkq??%BLV3ln!S&WcL_vM;o z6k&&*tNbU|5ukT*as61zoqOtIiW*Di27W(=lvZm&6dEn=;NXJ!S*N+0Rpq@+88#W$Q; z8O0z+`b4egJ~9d+l^B^8+gCNb#B_EL%uxies+a#9J>-I)A0j$R2qS4bi4xj@kQ-id zYEt!Uq8k;zINiT&`ar!5HgkCbBf^1!)l}UzPd^H9z#*_El+*U$`1P5fE7K-`8fF^@ z^uR>Serh6&oaIa^GG`re&|h_N4re$dpLO{p9hWHP7Ju9TLFhJ2P{Lp5YIME4D=3DA zN)qGmK;f0cV8Uei`X|b6Du;&I!U?m0rxwWi+)`yk&2}B3zeyPT)C5!c)I?)%%bX{zKx|FFlFJA8R$79z zUi9$<$(r1lU2D4==bz;?T3>`r1~?v7e0*Fi)(3P~NTcqGc=Xs&^pmb%4F?R-XcpPL zj>3KOx^IbaRr(h)ZnNBZD&Xx?BkFZm4r&?|e#KdsV4qR9B>{XYlfjh`R@Au)jtz40 z07;o+g)|e8i`no>%PEsBuPxt6_ASO6Dv=e;Fo91^08%2@#$TIf0Efzj%&DZBwHlDI ztVlStbX`vw03S9A^i!mch>yU0Mpq+Oi<~|PJN_yaoNaRk?)1*32YXg<6s<>=FWZ;2 zx6UN;YWqSamC+%PyViE9+?BoaGszgOgQR>rHc_kya{KX~Su9Lwyin#xYkPNaBaRD} z(NU$}1;>w_XhTVnR@Z5hWH;e0(EOoIaP52{-{svU(V*g;YOC_x72S@Yh1kal>R74; zj1T4zJu*54bG_CQTjjU;eZmoq6Qwf3jEcA+=bSHqW`;a=gahC4{{GJ^Oi{i($-ANAHn)V^0L|gLUzJN%^1PW zk5N(KGvi;=1F;bRuT5gaT81ni58@~iz$5(0IEHH+7fuIInYLj-wDEROnwk>AAFvNh zRwv$$jWmD_MdWgGFYh46l;7MXZ`Y^7)|c~(j@Qhx12$lH{wOs`Ea6}5SqMKVRlI+l zaykqdMGqc&+a8~bB#ia~JA#4&@g$4CO#h`nq7o@syG5qx3d80$s*b~@?_ka6_EidX z93zo*)>w|Zno+uxupdAPt`Oz09haeU(n-cpS6Ddyh1DQ6fJlUJQ{*#XR;iI^IyK=w z9%`hbqKsGJACOGyMnOSel`xv!9W%{zrNbu)5vXRzp)T;+CnQ48Dd3Mh&N49SFtIvj8ePj~)QNA(`5Nw1|O2 zfPMA=o4fyZj_B{=#FFDP_y;KHx7hl%kwi@y?<^K9JSFrOP6IaJZ?VW~!+DBu>=0 zGl5syH2OmGVIjjPTzeVV?~0yNb|Cjg#2OW#i?(tIhDL-scvTkqsv?3EQzYvwDFIBTK1|@nz-1Cq%heq zhTuZ&MIvJl=Ys6HhuSlA#3<^Wbrj zuy&Kg-s%>f7}{d$HMs77VMOL)ADZ#5`gWGgHpoI2(Kabf$9_Agp^ZjJ4Y7MGB62P2 zb`u{5s`^Ax29!~?oTRmILs3=k+r}gH%C5isJ4tx;C0MoFh29>K6ZilRSh(j63b2Zn z27o>Erb7WJY{RgeishIR!qS3f;_C_N9V~2M^%JKEDrGGz!Gc(inu*WlIPvQYfA28?} zRuj6ngri-hKb!@R5*uA#vb)O!kJEWpggFV=AUUWtXgZSH`Utb^cR8_7jno<(q6Y_x6d zz?6WI5xmT9jeWnyZISOP)5-)nAwkxQY8iFk0)O_LvKGU(=OQHw3}`Atg_beyj|*r) zFzQZYFz}T9WpWo66J){V5NlJng#WtdMsdjo{HlWyax%_vg*!rj0(63~{X?GB(Wagd z0Mh`@wJSY96-3$uS>$*R8Q9n>kfxh+ZVRVg-}hhlwr5MK42Pp&#TxbZu<4Ca&&XOw z4SYC9nrHk9h(}Sc`N6joeUa_74D$tZ*lT)*S*3LsYyV}*{&p%^tj8Q)oB(C9{2 ztYt0^R@D$k9gn%f@u80CZH8osN5d>a8?eu%y7xOPzI6K0Sp3emp9eu;Ni$m#3i_$i z5ALl%k{c?Zj#G(rlevICMe69=5(kbUn0?D&qIa1d^)a33JEBd zLy=OraQiyXkikE}G=s|%^fvy55OTDVmsruV$`1<8g%0blQ8N)yPH-e-6a~}znho9j zvK=13>Oa;D5elt*mmc-Z#Ym|Zm}9C(cBx2`QAD^P@pB*x!yx4mx>-n|C%b@6}9Av2e3FUfj#U-byXqI zj8by(E2Fr($T=Bka6R!BfSn$mA2Bz!LnZ+^(`e7@3v_q_6@C+BvI49gc<^1$cJ~=U z&MFC-V`a-VFOiF>-N@q=eO@F{1Y5JWFekIGBL?o|^L6pZE1qNK8PwQ0paZ6fyA<5x zWesQL0N;`3)aS0iWbg$E{nJqZlsgRQL8xvi&pY@PYxQCVUAFR#2z$-BC`k?&rq@NZ zea}^w<(W;xZr{IP%)mC0GVbS53Gs0`{LnJJhPt!}5j?J&6m{3jkl%4s-gQ^1PDQt? zC29ose>~8O41i@vw+*x~-4b~jjyyN>h_-8yJJ9y$`6U8D|0x$mjz|+tTh|$Msq?PN z?b2vN8d3HRMzaJ-jOIVbKLT+4_Xnfa+muNn49{+zX`0)R*^}!rsIKcn3gv?Q)|%m& zpYd&)WjhALnvX+EkH!A$>Rx04?tSrzZi@k=K)NY1muX+4Trk;@w$a8old9_z zg|E+GI%YYpymvW~ZTMfO*VhFFu-V(!o6#(OhZ|D&IkQu5XI+m>aM<2H|7vlq#Vn&L z%Pq=~~WT{;wZx$_H3#Gd`=$J{B^Ox**_osx7`c>VlmR z-0%7P$A1LuQz=O~D<4L)TIn|nhq7P)`vn-#!-k+Qs(7;=Dbatn^#8i_`Su2VtYlbz z{-=lUcA>tSkO0RQJ(BeQy6_hO=VK&a2d0k?wEzCXk%pueY;BLW!a zDzTb41=2M!$X!p))4-{#c`M$ZN(Tyb5#sOpG%$Z76n_~;$^XynQjiHn<|J{F%f9s; z28tXNi;fmo88)Cxd|_Yobyqn9dHFDYP2!pxzAvd=iShOwj~xm6uz1 zFGTbzT2*k-?9#(ODeH2+uv+?$<#B$g?AIYFbar<=mtwC3X)yaTpGn!LJ=8})k@As>B<=l5JX{f(-+j<|ZE*~G_Zhlv!40F7N zIc#?w!ed}bx*~YpL3k?w;x661TVRrmn5F}t@!uVY@xJ5Jep$^z;OkPwKk5kqTF2Pr zwHP=jz*$s{d|G>l(9yk}NIe>`aNbDHgph*z`TKj%nZkgYnzqw6fF$`rx&i?c$jIve zu-+#8B(Wk)R%a?#5AmA9Ab5-pQ)#3RH{NPHY+uOj9`M<2QSLZAlWwlJDGeoJ?T=dI z@lLQLvGs#P{gV{i*;ueB{0f!>w0%R7TDvmegVo^eZ#qjIl&aNyzY#gPqq{*x+hJ8O z40ZpK`VeE;hodFi)ruFpB_$h6b0{fElOpcW_P_eE0S=_ZAB1Bkc!lXK4wkyv>NeF! zD-d^2Sn<3iXQ^Fya|7&4zsK#*huWZ{RRxpYOSRB=9|(C3-^)UekXmbP{Dn z45!s!>0;5`EcFg3braFpykEQUxw?dKCVj#GqWiX@2|-j7`18rH%hfT*(gB)FmT(4$ zDSP95m`o6l`m!LpThond&q&Hb@HrEcJ%;O;cv1j0)_WKE zZ}wjpddL?2-{7s~y3}D4uNUL5k@Je})xk^RL1J#to+**1H4BU2@S~x9?p@m_tC;N8 z{h8eB-0UejBm70DV2eN?uCL(1WnS)`*2?UDE%e=OAaYo?&$EwTjpyQBZ8A1-&gOms zc(tyPqyCiCcLD4P^Xw`0&p~X)o<(DPMyhVcNTdIe>ly(7{!=r+9_CQKdX_)xka1xl z{V{2NahK(8en$b+-pb!MiuG3$PE*2)wN+kDG^#%(>maZ{GG)Y+(@Cpf#{{ooi#B)n z9tnI@x>3n$Mqk>Yg~`;6|7$4m#-GohKXu=CnBGLj{{-~XFEAiHJv+}>oiCP4Nv$iz zpAnxP!blWwD-f%y1}TE2s^UF6#U0^v{TUMaLuB34uw;ZjVA^Qj%Fam+Vg*pdl2y&Y z6iCF+ow?U#!&KsQcyHo`oG-ZS&uN6vkPQ2p-H&1gQkzV zq0wm2o7NRqte4DaKpS!+^o%Y9G{dF!r_W@5<8IL=HVD7~Us5xgwBXuqtI979aRgh+ z?CxQ?&|Tsl-VLP!FLxaItgoBkj#8_sJ1{h;s;KX`WaR3w=!f`dOD8OKPE4@vPhD^^ ztLW;k3&iFw3pJ{s<(Hy5_743q;_Zhp!8f(AYxC7JOMG87cbwf^ko{_P zmHAD)g9KWlYu}m1orp&nU&Z#aD2s*ovto;;mLe?sTte$m@4jq$9hShW1~>`BEki>| z_=AwKjqM(j8P-}XdN`#juKssUSDhLp)r%39p$-#X6%1{#6;2b05InX-)L5R=+D@qH z{TNzDqhNxm0QQ@*`mpu-vXe%@q+9e&bn2m2#ag@wHTk5Qx2Jt^^z|1Br$;$A+V`F5a?_Cs(ZSA5ze<|6Lo0R zD%|phdZCZ9GU(DQaNVHm3{w(^TVfEa1YgCEIiu&7OpIOrLOy1##{l{ILm`QR3Wzd3 zU|o7oh;UC}>{G7(z!Vcf6YeLCBh>aLApu+gGcK~c_!iL~;2`1RdEaYQb!hC9d_Qn* zdhR$db=`>|wrzC;<*K9{?SfO!c{PSLSC-h$S7o)@a|4PBCXGaJ>9$q<@w@^&_J%wC zcK&rkGK`K->1>O6aA&sXm)(TeLN2?o^mfA`iq1;q<>X&hx+h)(LG&wryKk+7YV}VQ zVe>i2lwamxLHkS#E`gTW4lLXf@s@89CKQcX>q^e7!q**ndsW_7#aD*iIi;Im>f8%b29_s zt>fcv&4IyPZ6<)GQ`w>O<3+^8M-cyb6;g7jhlH)2X+&v?kqH|s0S;-BH?b>d?FcNC zC`A;#t1NdY?HU^{N}H$J<9X_E#O=H^#Buy;vG0B02>J4yCWI4z>v35R=|+fUnWR#$ zPw7CH#$(NRY`0+z-`Xu(!&B5*=Y-Xq=sV@`8Oj8Il9goO+oq@UBjnFUgyYA_U zi9&17|rB;aiIcAn=9g0oKsQ)i-DeV z`40osvW2Zk5%zgJb|LX!|KNCIPdQ1BVngA?-}rgV;Cp2x*1P%LPKTd+Br=SJDtJ`*j4K70*JgoxkPFR#8#g9AxxQfXX~*|`o|Zr*}3CkEx} zuMSDJ)LfkV`0Mw|DKnAE?6Pqu_l+j(tC~&|ry1}?k!zgs9+L`Tpjz@(u_}pN2^RBq z4}Q52z`vnVx&Hp>zrN=1CViqxPMcO^QN7JUc|y+dJ{fauTcL+aTQcg6>wsctVfr*q z{s4xcIkM6}vQTCwe=7{XE8bOTMEAdL&g6Mk&ENwempKq%nNqlci3k|rr9`yOQ8O!7>sFBiEmUR^?CzsZ%29X?pkhEI<|5;7(O81gf#RZOu5>foq^V3}TgX_2 z*7fR3Oku#Z9oBnx*auf?GqirA3dOyJzWW7I?E2p6^p#)Il{d{` z+)=(v7s5|jd?-JA*%K{@H(n3?I+;-XA3M3K_yH8FJS4#_p7$4!+Fa$i4AtPC*N28O zArjOM;B*DEE;5ikJ{h^_j#4DaUiyMWyJwBg|1@ZrXM3^`js%^_B$NvK_rKU?Cz2);)c=fab51DDygIDwN7>S+aaX|e zei-*f-iR(%A1=77>4&FtzgV@9tX9|_8FfHeNIfMRsm&i~t_r_!YOVj+?yv_vJ+Rsv zU-<3Nu8y|sL1#Cm{{dT6P`fyKN_P;V&?o4DN5`Zx)6>bkf4QL-AS3rrtJKlVbBv%w zj5U3shy@j`H(K*DK5>N$rKPxdJ#j!tc?8juWLjpFvE}l3Hs{CqC8xzhs2)>eeHO3X z@@1gl{?+=D=YdHHiw}{8;P!+TifXs_pjpOh*q_O=s(Lp$&o_YHteYOnMZ|a`lYb=e zh{-2T199_M-MIUiG5-+{?yddkV+&bK{6e}7M+wI#^az!}t2bsm++1rrUhj}2+weST z{p!*^>RsA}$jGMyxw^u)?vU&SJJcrV{CI0-_Elac=C8nPp3wgp7Z>L(r|`#e zCqC1rx67NLH)_@xuA*zm(oNy_PkymfXl9cbelRANT&{*!r_hTwOzE9ea5NfYwgsh2 z5i$kHze*2+(XTKTXIy--Gzx z4Q>fxM3yP)v8loh=irWVV8@rwuZwBK?~2Va-v{0p)X-=7c4bmu)-o9hxQbP1b>EMG zPb6{hEEcOREXcrfp!Q_-PAacoM0<5Ut z`4`wAWljII#Cy4<5o7%`=)Jpc9-ok?P)AN5b@3Bkbx$Zm% z9xO**>19E*`$K#9rS&KHNG=DWh!8(f^=N_IVNe z>MI$Dm-hH{zgY=kDrWT>4x`NEqigvpeQU+68`*Ld5SqLUo{bHfW-h+PcR zj%~s63m$rMJ|*g0Y?lPaSQ%YsZR0G!NDYNB!b zgLCESz*32LP-+1Yc^&Kh2I9A-m%yA&#TzES)!+fI_QWX_ZskH)xf}?QF1fn0#oimZtG>2O%PL*0 ze_2)hA_^U70|n+SMu#|v8I3?omrRrbNGLm{SerW*34_uWS}GAxGkGn}r3L&CZC5N} zS4MTppF9Lhw4VUd9a;7Cu)@Eej7^Z>MS_Wl3vDX1AEgNM*RY5{&2y~5eXILdD>enU z8;GafO;b@BE_BQXsK*V=#Dr*YTb8ZRH0F3+>7L#-9)f_H0>Lq^RnyjD3a&4UB;H=jIma=;Qd|Nk91?Z4%IblxLCHwXsc`IKz=vXYcuYWX>Fx`ws)^ zibd5iVKB5sX5IEF;ZI^Rn-K%GW0*tqU*4M|*Uv+dF7R2d??^c}a z@cYPTDhNEJ>DO0o%|;!l{LSXbEzoeedOYv*0KQT?9C%-aW4jyW?pC*f*_z`U%$Y^e z8*Uzs#Fy|y`*U;ER75QSmBEcPzQvAZvZMIP0t$a6DpTRetKDRB1amah!WkMKnxX4i zYH7XS@Nb_NWP!dlrqD{9fxn@o z{Ma_|s_>`i^8lm!%v>16sQ1%OM_r)6Om&J@ zm|?9_tm8W19kZ?V7^%fUiceYo(Am(gK6j670hj$=U#|O#aUzD&(T*e~9$)@4VMWK->_&^NSU;3(_w%cJX-Pzds)-HE zoQV9pieNqJp4n0=-Ii;~ejJ?zIh=1=Hmq1{Z4bwQnc-Fyw8_7XjRt%r10M>J7=}S@ zals$CBgbo(tt1&O;L2A414AMb`T<8mmsg`7OaI64O4w%>Xo zM{SzkEY9;0x)+_fZ^g(%6`pn~IE01}dlC0rb;C~~X8rO729nN`5yC6?e{l~yawi-Q z*{J>L3^YKKg9DQ~(?wT^Dfu*%8(q<;cnA|1RRymgGznGNQOD*BDLYYjtvMfqXi>1y}#;bO$1<`UW zAkH>aB+kl;lF++80e<<$FqtJzLi@uerQSWLmiWsx)k+czyqwCNS5ASn1p~eE-jB{i zNCOQQ)8vJk-$SF9m$)dx#;WWI-Kgpp>xp~v z9yW=ZFALntj->Z<`b)8#1E^YsQ6l+FkPXFDAn2DlnBn`BIy&jyZ@*(nF7eYil zerB-n(=w6pRqIFgbIO>Q-!U{X+%?bi;zMYEqgMmVm2HVws4vb=@)rCkgz|1mRv4J) zCWQU9Xc5(*PLve>`H}PglE%8z%yOv~Uw-?k(Z&v;ba}_%5Rr#o`#62fEYONvh*#GdclWUfj?K7{-qKT%Yd@CdJLbzL z*0AF>^kuY?t@m9d5AMNqI%-1XA;I5MwbP8G@C``zD>>QQmJicgJ z+1*erD%W-x9i$ybKQ~vLg}TwX4)DY(A=%?VXyNo^U;8vll+~eOY5PNGnI6FkHDf9R z8+AU45IOaDw5hs4!^)qtN@~I?%WwTXcsFm@xi;0z_b4IE2a;aM7ykH~-G3GeA6id7 zL^-_DH_`j%jy+;ro6atyLDC&F+V;A=Zz1vt<%`xexBXCz%;r&oXS^ni|S zr8kxaJlYdb&-yDnz(lS6)`W(oh<#o5+x9b^MK;y-Z9|ysmTBKaW?rQAY(=+1p+)gd z+G*jLlAf^JSc|5_Q&>^}t*e$W6#7+Zy6ubi=cZe#aB3N^gZOg}o*^%8!O~MF=_|SH3c-#+l^-eM4l_as1 zsfv42P;}{fkZDbzI!pI@Jqv_b=c|Wm)h8|keZMe+Ap?; zWlLH8x;CSx-t@Bc4}GYfeQ@kKzqg}|lHHQu#D!-);1f=8xOvcW?=0PYUU%9h!=|70 zP1OGTezkb=LAP(kUbPyH8l4P3Z9MbQ^=|OJ&m4M_pQ>WIHw8Y(60wI+T(Ukyst=xZ#kDoGV@1E==%G)v|=m6T$t*dsL+DczqQCgsUp@*^5WVj5aBQ)DLa**!z zM*)-&6(3KB?5I3Tj#RFagAH@RAwRlw8}YW5HB4S@ z{P$-S66ERpd=ta3G5C5&{?hfI|4Lij!B;b=iK&!achc7HVXG^I-Fa!T)8FOJF5?Cc z*zP&puR@=$yWbX9zNTrCj!>^gT5838^zTd`g6LR zsO!fYQr;EtM*kbQ=WE_Acf%wC99xZey91GV!GJ$x=SIoVers z74-H})VCt;ra`Dq$>U z7{nE4{?9fP%c1$G)hKVCb6kXlz_$20wX5(?Oj+ZP$qfh#3!fE|YT(3KuFQgx{z6Fk zS}a?ebCcgf%u0UtJRaN`RIVF)vr?PV^2`b&rM^69dYPQ@E+H0(mJ*hjz)eeUkWuSx zhF3k(4*%%+6!C-c+xb*dAI$?l(RDU?s!J4pduOr_tyW1X7jBct1FC4H{Dzfm6EZ{w z7tf_yp-x2qX-vF-e39APWkuanA{e^BRQoBic{6Il2WTcc(qzQ#P`Gmis_M>tGtNHs$0V0(+3YUt)M40~i;Sw@~W&B3G!ZdfsMs0ZnGW&UQ%Gwa~e&0yY2xmigsIvR$;dn{XzBT~CQW@>?oHeM!8ec%kx&8JIMxqu3O z*B+Ql%aq{N=^NU2j2NSV&Yy0zTeU&7zSYDnNBO&Htg_iRl{Eg2vU2G%_o(5=mQ7F8 ztph~PE1a-~`*03psw$7YKZj8@a)vSy=p>lu@ie9KmdZx_S8CJ_7-$6E*;?s@`DR|z z5svFanIgWqa7~hZJ%h}=1EG&mN1fdu+nAz_zRLOjc>$^Q@@JB@^L-ixWTMT2*~)0yoa zFDO)m7V3ynH~3CWE}CD*QfzBjc*gCrW3Fh6&%pp~F*x0%NoB)8I?P9Se~~8RxSstc zzG?s6;>AC0A3giwUB5VIw1^G6{SPtrj>|apFr?ns?#v~tBXwEYh$17t&_}NO)IC|E z@@>SC_l0$U>!7;(`yt$RJ}6Kks>Ph`CSQ)7%bGG6=cA_rYr(wPG?!iQHE=>XYiYx42 zT2dEAKFv+Kb^anEER-2l%B-twV;`i6vlh0LF)l0B}Y?G-nwfnJtX>`R5LgYv+-MO{OML3b}Xt z{rgq5FL{>7b704398KG%nFKZ- z8%X#DBSMa}jxf(BNAPGFb4yS9Fq)xwH6;n-V{+GKx>ou)m;!GH2b6Qn^ZMoklmBAX zBnxmFSXtlCsZ>ojN!2%86yDxbI7Ggr^@@EO$I~ftu%;O6Q)IMrqt=Z1^A&P_mBn-* zi*w(qjc)-?MA(%_f(&dGtGaQm_T#s{|E2$>-+*ON0Wj?5T)1&4KS4O+*bpTj?-tGH zgS{BeX%p~SK&s!TKknm1ziK{C@ibeus*w6cJ0Otdo%>|d@GFo-U@F3UAXfXc*wPFp z(q_gSEDvY-=I|G_h>bn6nKVUSL4xUAxH>_%x0agldNzyW#(#JS11aXpt@2eGViHBw zk_ziGYqx>9i9Fz`BaB+X!&q7aQa-Lx(p($0)WK*6@OWovTt#Td9B`rpdyX4*#=~kD zC3;XeXO)#cWz5LyLeoV9j{j8QX+;1$nF(bwB8`X5@IUq#O;N!Zm=SalN zqP}{~;+g6#n-+HufIrCntuF{^u;yzBee3@R<8J{V(tuphMZR|Z8(7%iy3HcLROzm- V34P#W=|ut@I+_L=b!v|z{|~%yPsacN diff --git a/1-js/5-functions-closures/7-with/1-with-function/solution.md b/1-js/5-functions-closures/7-with/1-with-function/solution.md deleted file mode 100644 index d4a5284b..00000000 --- a/1-js/5-functions-closures/7-with/1-with-function/solution.md +++ /dev/null @@ -1,21 +0,0 @@ -Вторая (`2`), т.к. при обращении к любой переменной внутри `with` -- она ищется прежде всего в объекте. - -Соответственно, будет выведено `2`: - -```js -//+ run -function f() { - alert(1) -} - -var obj = { - f: function() { - alert(2) - } -}; - -with(obj) { - f(); -} -``` - diff --git a/1-js/5-functions-closures/7-with/1-with-function/task.md b/1-js/5-functions-closures/7-with/1-with-function/task.md deleted file mode 100644 index bdf540ec..00000000 --- a/1-js/5-functions-closures/7-with/1-with-function/task.md +++ /dev/null @@ -1,22 +0,0 @@ -# With + функция - -[importance 5] - -Какая из функций будет вызвана? - -```js -function f() { - alert(1) -} - -var obj = { - f: function() { - alert(2) - } -}; - -with(obj) { - f(); -} -``` - diff --git a/1-js/5-functions-closures/7-with/2-with-variables/solution.md b/1-js/5-functions-closures/7-with/2-with-variables/solution.md deleted file mode 100644 index 531c8a81..00000000 --- a/1-js/5-functions-closures/7-with/2-with-variables/solution.md +++ /dev/null @@ -1,22 +0,0 @@ -Выведет `3`. - -**Конструкция `with` не создаёт области видимости,** её создают только функции. Поэтому объявление `var b` внутри конструкции работает также, как если бы оно было вне её. - -Код в задаче эквивалентен такому: - -```js -//+ run -var a = 1; -*!* -var b; -*/!* - -var obj = { - b: 2 -} - -with(obj) { - alert( a + b ); -} -``` - diff --git a/1-js/5-functions-closures/7-with/2-with-variables/task.md b/1-js/5-functions-closures/7-with/2-with-variables/task.md deleted file mode 100644 index 13705a1d..00000000 --- a/1-js/5-functions-closures/7-with/2-with-variables/task.md +++ /dev/null @@ -1,19 +0,0 @@ -# With + переменные - -[importance 5] - -Что выведет этот код? - -```js -var a = 1; - -var obj = { - b: 2 -}; - -with(obj) { - var b; - alert( a + b ); -} -``` - diff --git a/1-js/5-functions-closures/7-with/article.md b/1-js/5-functions-closures/7-with/article.md deleted file mode 100644 index 9c6434ff..00000000 --- a/1-js/5-functions-closures/7-with/article.md +++ /dev/null @@ -1,190 +0,0 @@ -# Устаревшая конструкция "with" - -Конструкция `with` позволяет использовать в качестве области видимости для переменных произвольный объект. - -В современном JavaScript от этой конструкции отказались. С `use strict` она не работает, но её ещё можно найти в старом коде, так что стоит познакомиться с ней, чтобы если что -- понимать, о чём речь. - -[cut] -Синтаксис: - -```js -with(obj) { - ...код... -} -``` - -Любое обращение к переменной внутри `with` сначала ищет её среди свойств `obj`, а только потом -- вне `with`. - -## Пример - -В примере ниже переменная будет взята не из глобальной области, а из `obj`: - -```js -//+ run -var a = 5; - -var obj = { - a: 10 -}; - -*!* -with(obj) { - alert( a ); // 10, из obj - } -*/!* -``` - -Попробуем получить переменную, которой в `obj` нет: - -```js -//+ run -var b = 1; - -var obj = { - a: 10 -}; - -*!* -with(obj) { - alert( b ); // 1, из window - } -*/!* -``` - -Здесь интерпретатор сначала проверяет наличие `obj.b`, не находит и идет вне `with`. - -Особенно забавно выглядит применение вложенных `with`: - -```js -//+ run -var obj = { - weight: 10, - size: { - width: 5, - height: 7 - } -}; - -with(obj) { - with(size) { // size будет взят из obj -*!* - alert( width * height / weight ); // width,height из size, weight из obj -*/!* - } -} -``` - -Свойства из разных объектов используются как обычные переменные... Магия! Порядок поиска переменных в выделенном коде: `size => obj => window`. - - -## Изменения переменной - -При использовании `with`, как и во вложенных функциях -- переменная изменяется в той области, где была найдена. - -Например: - -```js -//+ run -var obj = { - a: 10 -} - -*!* -with(obj) { - a = 20; - } -*/!* -alert( obj.a ); // 20, переменная была изменена в объекте -``` - -## Почему отказались от with? - -Есть несколько причин. - -

      -
    1. В современном стандарте `JavaScript` отказались от `with`, потому что конструкция `with` подвержена ошибкам и непрозрачна. - -Проблемы возникают в том случае, когда в `with(obj)` присваивается переменная, которая по замыслу должна быть в свойствах `obj`, но ее там нет. - -Например: - -```js -//+ run -var obj = { - weight: 10 -}; - -with(obj) { - weight = 20; // (1) - size = 35; // (2) -} - -alert( obj.size ); -alert( window.size ); -``` - -В строке `(2)` присваивается свойство, отсутствующее в `obj`. В результате интерпретатор, не найдя его, создает новую глобальную переменную `window.size`. - -Такие ошибки редки, но очень сложны в отладке, особенно если `size` изменилась не в `window`, а где-нибудь во внешнем `LexicalEnvironment`. -
    2. -
    3. Еще одна причина -- алгоритмы сжатия JavaScript не любят `with`. Перед выкладкой на сервер JavaScript сжимают. Для этого есть много инструментов, например [Closure Compiler](http://code.google.com/intl/ru-RU/closure/compiler/) и [UglifyJS](https://github.com/mishoo/UglifyJS). Обычно они переименовывают локальные переменные в более короткие имена, но не свойства объектов. С конструкцией `with` до запуска кода непонятно -- откуда будет взята переменная. Поэтому выходит, что, на всякий случай (если это свойство), лучше её не переименовывать. Таким образом, качество сжатия кода страдает.
    4. -
    5. Ну и, наконец, производительность -- усложнение поиска переменной из-за `with` влечет дополнительные накладные расходы. - -Современные движки применяют много внутренних оптимизаций, ряд которых не могут быть применены к коду, в котором есть `with`. - -Вот, к примеру, запустите этот код в современном браузере. Производительность функции `fast` существенно отличается `slow` с пустым(!) `with`. И дело тут именно в `with`, т.к. наличие этой конструкции препятствует оптимизации. - -```js -//+ run -var i = 0; - -function fast() { - i++; -} - -function slow() { - with(i) {} - i++; -} - - -var time = performance.now(); -while (i < 1000000) fast(); -alert( "Без with: " + (performance.now() - time) ); - -var time = performance.now(); -i = 0; -while (i < 1000000) slow(); -alert( "С with: " + (performance.now() - time) ); -``` - -
    6. -
    - -### Замена with - -Вместо `with` рекомендуется использовать временную переменную, например: - -```js -/* вместо -with(elem.style) { - top = '10px'; - left = '20px'; -} -*/ - -var s = elem.style; - -s.top = '10px'; -s.left = '0'; -``` - -Это не так элегантно, но убирает лишний уровень вложенности и абсолютно точно понятно, что будет происходить и куда присвоятся свойства. - -## Итого - -
      -
    • Конструкция `with(obj) { ... }` использует `obj` как дополнительную область видимости. Все переменные, к которым идет обращение внутри блока, сначала ищутся в `obj`.
    • -
    • Конструкция `with` устарела и не рекомендуется по ряду причин. Избегайте её.
    • -
    - diff --git a/1-js/5-functions-closures/index.md b/1-js/5-functions-closures/index.md deleted file mode 100644 index faff5532..00000000 --- a/1-js/5-functions-closures/index.md +++ /dev/null @@ -1,5 +0,0 @@ -# Замыкания, область видимости - -Понимание "области видимости" и "замыканий" -- ключевое в изучении JavaScript, без них "каши не сваришь". - -В этом разделе мы более глубоко изучаем переменные и функции -- и замыкания в том числе. \ No newline at end of file diff --git a/1-js/6-objects-more/1-object-methods/1-call-array-this/solution.md b/1-js/6-objects-more/1-object-methods/1-call-array-this/solution.md deleted file mode 100644 index dad88eea..00000000 --- a/1-js/6-objects-more/1-object-methods/1-call-array-this/solution.md +++ /dev/null @@ -1,15 +0,0 @@ -Вызов `arr[2]()` -- это обращение к методу объекта `obj[method]()`, в роли `obj` выступает `arr`, а в роли метода: `2`. - -Поэтому, как это бывает при вызове функции как метода, функция `arr[2]` получит `this = arr` и выведет массив: - -```js -//+ run -var arr = ["a", "b"]; - -arr.push(function() { - alert( this ); -}) - -arr[2](); // "a","b",function -``` - diff --git a/1-js/6-objects-more/1-object-methods/1-call-array-this/task.md b/1-js/6-objects-more/1-object-methods/1-call-array-this/task.md deleted file mode 100644 index 6ab74bfc..00000000 --- a/1-js/6-objects-more/1-object-methods/1-call-array-this/task.md +++ /dev/null @@ -1,16 +0,0 @@ -# Вызов в контексте массива - -[importance 5] - -Каким будет результат? Почему? - -```js -var arr = ["a", "b"]; - -arr.push(function() { - alert( this ); -}) - -arr[2](); // ? -``` - diff --git a/1-js/6-objects-more/1-object-methods/2-check-syntax/solution.md b/1-js/6-objects-more/1-object-methods/2-check-syntax/solution.md deleted file mode 100644 index b030823d..00000000 --- a/1-js/6-objects-more/1-object-methods/2-check-syntax/solution.md +++ /dev/null @@ -1,27 +0,0 @@ -**Ошибка**! - -Попробуйте: - -```js -//+ run -var obj = { - go: function() { - alert(this) - } -} - -(obj.go)() // error! -``` - -Причем сообщение об ошибке в большинстве браузеров не даёт понять, что на самом деле не так. - -**Ошибка возникла из-за того, что после объявления `obj` пропущена точка с запятой.** - -JavaScript игнорирует перевод строки перед скобкой `(obj.go)()` и читает этот код как: - -```js -//+ no-beautify -var obj = { go:... }(obj.go)() -``` - -Интерпретатор попытается вычислить это выражение, которое обозначает вызов объекта `{ go: ... }` как функции с аргументом `(obj.go)`. При этом, естественно, возникнет ошибка. diff --git a/1-js/6-objects-more/1-object-methods/2-check-syntax/task.md b/1-js/6-objects-more/1-object-methods/2-check-syntax/task.md deleted file mode 100644 index 44a93141..00000000 --- a/1-js/6-objects-more/1-object-methods/2-check-syntax/task.md +++ /dev/null @@ -1,16 +0,0 @@ -# Проверка синтаксиса - -[importance 2] - -Каков будет результат этого кода? - -```js -//+ no-beautify -var obj = { - go: function() { alert(this) } -} - -(obj.go)() -``` - -P.S. Есть подвох :) \ No newline at end of file diff --git a/1-js/6-objects-more/1-object-methods/3-why-this/solution.md b/1-js/6-objects-more/1-object-methods/3-why-this/solution.md deleted file mode 100644 index 693d3944..00000000 --- a/1-js/6-objects-more/1-object-methods/3-why-this/solution.md +++ /dev/null @@ -1,32 +0,0 @@ -
      -
    1. Обычный вызов функции в контексте объекта.
    2. -
    3. То же самое, скобки ни на что не влияют.
    4. -
    5. Здесь не просто вызов `obj.method()`, а более сложный вызов вида `(выражение).method()`. Такой вызов работает, как если бы он был разбит на две строки: - -```js -//+ no-beautify -f = obj.go; // сначала вычислить выражение -f(); // потом вызвать то, что получилось -``` - -При этом `f()` выполняется как обычная функция, без передачи `this`. -
    6. -
    7. Здесь также слева от точки находится выражение, вызов аналогичен двум строкам.
    8. -
    - -В спецификации это объясняется при помощи специального внутреннего типа [Reference Type](http://es5.github.com/x8.html#x8.7). - -Если подробнее -- то `obj.go()` состоит из двух операций: -
      -
    1. Сначала получить свойство `obj.go`.
    2. -
    3. Потом вызвать его как функцию.
    4. -
    - -Но откуда на шаге 2 получить `this`? Как раз для этого операция получения свойства `obj.go` возвращает значение особого типа `Reference Type`, который в дополнение к свойству `go` содержит информацию об `obj`. Далее, на втором шаге, вызов его при помощи скобок `()` правильно устанавливает `this`. - -**Любые другие операции, кроме вызова, превращают `Reference Type` в обычный тип, в данном случае -- функцию `go` (так уж этот тип устроен).** - -Поэтому получается, что `(method = obj.go)` присваивает в переменную `method` функцию `go`, уже без всякой информации об объекте `obj`. - -Аналогичная ситуация и в случае `(4)`: оператор ИЛИ `||` делает из `Reference Type` обычную функцию. - diff --git a/1-js/6-objects-more/1-object-methods/3-why-this/task.md b/1-js/6-objects-more/1-object-methods/3-why-this/task.md deleted file mode 100644 index 486c3eb7..00000000 --- a/1-js/6-objects-more/1-object-methods/3-why-this/task.md +++ /dev/null @@ -1,26 +0,0 @@ -# Почему this присваивается именно так? - -[importance 3] - -Вызовы `(1)` и `(2)` в примере ниже работают не так, как `(3)` и `(4)`: - -```js -//+ run no-beautify -"use strict" - -var obj, f; - -obj = { - go: function() { alert(this); } -}; - -obj.go(); // (1) object - -(obj.go)(); // (2) object - -(method = obj.go)(); // (3) undefined - -(obj.go || obj.stop)(); // (4) undefined -``` - -В чём дело? Объясните логику работы `this`. diff --git a/1-js/6-objects-more/1-object-methods/4-object-property-this/solution.md b/1-js/6-objects-more/1-object-methods/4-object-property-this/solution.md deleted file mode 100644 index 82f562d9..00000000 --- a/1-js/6-objects-more/1-object-methods/4-object-property-this/solution.md +++ /dev/null @@ -1,22 +0,0 @@ -**Ответ: пустая строка.** - -```js -//+ run -var name = ""; - -var user = { - name: "Василий", - -*!* - export: this // (*) -*/!* -}; - -alert( user.export.name ); -``` - -Объявление объекта само по себе не влияет на `this`. Никаких функций, которые могли бы повлиять на контекст, здесь нет. - -Так как код находится вообще вне любых функций, то `this` в нём равен `window` (при `use strict` было бы `undefined`). - -Получается, что в строке `(*)` мы имеем `export: window`, так что далее `alert(user.export.name)` выводит свойство `window.name`, то есть глобальную переменную `name`, которая равна пустой строке. diff --git a/1-js/6-objects-more/1-object-methods/4-object-property-this/task.md b/1-js/6-objects-more/1-object-methods/4-object-property-this/task.md deleted file mode 100644 index 6b2ec0ac..00000000 --- a/1-js/6-objects-more/1-object-methods/4-object-property-this/task.md +++ /dev/null @@ -1,18 +0,0 @@ -# Значение this в объявлении объекта - -[importance 5] - -Что выведет `alert` в этом коде? Почему? - -```js -var name = ""; - -var user = { - name: "Василий", - - export: this -}; - -alert( user.export.name ); -``` - diff --git a/1-js/6-objects-more/1-object-methods/5-return-this/solution.md b/1-js/6-objects-more/1-object-methods/5-return-this/solution.md deleted file mode 100644 index b34977b4..00000000 --- a/1-js/6-objects-more/1-object-methods/5-return-this/solution.md +++ /dev/null @@ -1,5 +0,0 @@ -**Ответ: `Василий`.** - -Вызов `user.export()` использует `this`, который равен объекту до точки, то есть внутри `user.export()` строка `return this` возвращает объект `user`. - -В итоге выводится свойство `name` объекта `user`, равное `"Василий"`. diff --git a/1-js/6-objects-more/1-object-methods/5-return-this/task.md b/1-js/6-objects-more/1-object-methods/5-return-this/task.md deleted file mode 100644 index 03ebd8cb..00000000 --- a/1-js/6-objects-more/1-object-methods/5-return-this/task.md +++ /dev/null @@ -1,21 +0,0 @@ -# Возврат this - -[importance 5] - -Что выведет `alert` в этом коде? Почему? - -```js -var name = ""; - -var user = { - name: "Василий", - - export: function() { - return this; - } - -}; - -alert( user.export().name ); -``` - diff --git a/1-js/6-objects-more/1-object-methods/6-return-object-this/solution.md b/1-js/6-objects-more/1-object-methods/6-return-object-this/solution.md deleted file mode 100644 index 2df08422..00000000 --- a/1-js/6-objects-more/1-object-methods/6-return-object-this/solution.md +++ /dev/null @@ -1,26 +0,0 @@ -**Ответ: `Василий`.** - -Во время выполнения `user.export()` значение `this = user`. - -При создании объекта `{ value: this }`, в свойство `value` копируется ссылка на текущий контекст, то есть на `user`. - -Получается что `user.export().value == user`. - - -```js -//+ run -var name = ""; - -var user = { - name: "Василий", - - export: function() { - return { - value: this - }; - } - -}; - -alert( user.export().value == user ); // true -``` \ No newline at end of file diff --git a/1-js/6-objects-more/1-object-methods/6-return-object-this/task.md b/1-js/6-objects-more/1-object-methods/6-return-object-this/task.md deleted file mode 100644 index b78e6553..00000000 --- a/1-js/6-objects-more/1-object-methods/6-return-object-this/task.md +++ /dev/null @@ -1,23 +0,0 @@ -# Возврат объекта с this - -[importance 5] - -Что выведет `alert` в этом коде? Почему? - -```js -var name = ""; - -var user = { - name: "Василий", - - export: function() { - return { - value: this - }; - } - -}; - -alert( user.export().value.name ); -``` - diff --git a/1-js/6-objects-more/1-object-methods/7-calculator/_js.view/solution.js b/1-js/6-objects-more/1-object-methods/7-calculator/_js.view/solution.js deleted file mode 100644 index 5f276b9c..00000000 --- a/1-js/6-objects-more/1-object-methods/7-calculator/_js.view/solution.js +++ /dev/null @@ -1,14 +0,0 @@ -var calculator = { - sum: function() { - return this.a + this.b; - }, - - mul: function() { - return this.a * this.b; - }, - - read: function() { - this.a = +prompt('a?', 0); - this.b = +prompt('b?', 0); - } -} \ No newline at end of file diff --git a/1-js/6-objects-more/1-object-methods/7-calculator/_js.view/test.js b/1-js/6-objects-more/1-object-methods/7-calculator/_js.view/test.js deleted file mode 100644 index cd2c9b05..00000000 --- a/1-js/6-objects-more/1-object-methods/7-calculator/_js.view/test.js +++ /dev/null @@ -1,22 +0,0 @@ -sinon.stub(window, "prompt"); - -prompt.onCall(0).returns("2"); -prompt.onCall(1).returns("3"); - -describe("calculator", function() { - before(function() { - calculator.read(); - }); - - it("при вводе 2 и 3 сумма равна 5", function() { - assert.equal(calculator.sum(), 5); - }); - - it("при вводе 2 и 3 произведение равно 6", function() { - assert.equal(calculator.mul(), 6); - }); -}); - -after(function() { - prompt.restore(); -}); \ No newline at end of file diff --git a/1-js/6-objects-more/1-object-methods/7-calculator/solution.md b/1-js/6-objects-more/1-object-methods/7-calculator/solution.md deleted file mode 100644 index 1849cc94..00000000 --- a/1-js/6-objects-more/1-object-methods/7-calculator/solution.md +++ /dev/null @@ -1,24 +0,0 @@ - - -```js -//+ run demo -var calculator = { - sum: function() { - return this.a + this.b; - }, - - mul: function() { - return this.a * this.b; - }, - - read: function() { - this.a = +prompt('a?', 0); - this.b = +prompt('b?', 0); - } -} - -calculator.read(); -alert( calculator.sum() ); -alert( calculator.mul() ); -``` - diff --git a/1-js/6-objects-more/1-object-methods/7-calculator/task.md b/1-js/6-objects-more/1-object-methods/7-calculator/task.md deleted file mode 100644 index 5e5790fc..00000000 --- a/1-js/6-objects-more/1-object-methods/7-calculator/task.md +++ /dev/null @@ -1,22 +0,0 @@ -# Создайте калькулятор - -[importance 5] - -Создайте объект `calculator` с тремя методами: -
      -
    • `read()` запрашивает `prompt` два значения и сохраняет их как свойства объекта
    • -
    • `sum()` возвращает сумму этих двух значений
    • -
    • `mul()` возвращает произведение этих двух значений
    • -
    - -```js -var calculator = { - ...ваш код... -} - -calculator.read(); -alert( calculator.sum() ); -alert( calculator.mul() ); -``` - -[demo /] diff --git a/1-js/6-objects-more/1-object-methods/8-chain-calls/solution.md b/1-js/6-objects-more/1-object-methods/8-chain-calls/solution.md deleted file mode 100644 index 8d89b88e..00000000 --- a/1-js/6-objects-more/1-object-methods/8-chain-calls/solution.md +++ /dev/null @@ -1,23 +0,0 @@ -Решение состоит в том, чтобы каждый раз возвращать текущий объект. Это делается добавлением `return this` в конце каждого метода: - -```js -//+ run -var ladder = { - step: 0, - up: function() { - this.step++; - return this; - }, - down: function() { - this.step--; - return this; - }, - showStep: function() { - alert( this.step ); - return this; - } -} - -ladder.up().up().down().up().down().showStep(); // 1 -``` - diff --git a/1-js/6-objects-more/1-object-methods/8-chain-calls/task.md b/1-js/6-objects-more/1-object-methods/8-chain-calls/task.md deleted file mode 100644 index 73dc4e8e..00000000 --- a/1-js/6-objects-more/1-object-methods/8-chain-calls/task.md +++ /dev/null @@ -1,40 +0,0 @@ -# Цепочка вызовов - -[importance 2] - -Есть объект "лестница" ladder: - -```js -var ladder = { - step: 0, - up: function() { // вверх по лестнице - this.step++; - }, - down: function() { // вниз по лестнице - this.step--; - }, - showStep: function() { // вывести текущую ступеньку - alert( this.step ); - } -}; -``` - -Сейчас, если нужно последовательно вызвать несколько методов объекта, это можно сделать так: - -```js -ladder.up(); -ladder.up(); -ladder.down(); -ladder.showStep(); // 1 -``` - -Модифицируйте код методов объекта, чтобы вызовы можно было делать цепочкой, вот так: - -```js -ladder.up().up().down().up().down().showStep(); // 1 -``` - -Как видно, такая запись содержит "меньше букв" и может быть более наглядной. - -Такой подход называется "чейнинг" (chaining) и используется, например, во фреймворке jQuery. - diff --git a/1-js/6-objects-more/1-object-methods/article.md b/1-js/6-objects-more/1-object-methods/article.md deleted file mode 100644 index 4a70f595..00000000 --- a/1-js/6-objects-more/1-object-methods/article.md +++ /dev/null @@ -1,244 +0,0 @@ -# Методы объектов, this - -До этого мы говорили об объекте лишь как о хранилище значений. Теперь пойдём дальше и поговорим об объектах как о сущностях со своими функциями ("методами"). -[cut] - -## Методы у объектов - -При объявлении объекта можно указать свойство-функцию, например: - -```js -//+ run -var user = { - name: 'Василий', - -*!* - // метод -*/!* - sayHi: function() { - alert( 'Привет!' ); - } - -}; - -*!* -// Вызов -user.sayHi(); -*/!* -``` - -Свойства-функции называют "методами" объектов. Их можно добавлять и удалять в любой момент, в том числе и явным присваиванием: - -```js -//+ run -var user = { - name: 'Василий' -}; - -*!* -user.sayHi = function() { // присвоили метод после создания объекта - alert('Привет!'); -}; -*/!* - -// Вызов метода: -*!*user.sayHi();*/!* -``` - -## Доступ к объекту через this - -Для полноценной работы метод должен иметь доступ к данным объекта. В частности, вызов `user.sayHi()` может захотеть вывести имя пользователя. - -**Для доступа к текущему объекту из метода используется ключевое слово `this`**. - -Значением `this` является объект перед "точкой", в контексте которого вызван метод, например: - -```js -//+ run -var user = { - name: 'Василий', - - sayHi: function() { - alert( *!*this.name*/!* ); - } -}; - -user.sayHi(); // sayHi в контексте user -``` - -Здесь при выполнении функции `user.sayHi()` в `this` будет храниться ссылка на текущий объект `user`. - -Вместо `this` внутри `sayHi` можно было бы обратиться к объекту, используя переменную `user`: - -```js -... - sayHi: function() { - alert( *!*user.name*/!* ); - } -... -``` - -...Однако, такое решение нестабильно. Если мы решим скопировать объект в другую переменную, например `admin = user`, а в переменную `user` записать что-то другое -- обращение будет совсем не по адресу: - -```js -//+ run -var user = { - name: 'Василий', - - sayHi: function() { - alert( *!*user.name*/!* ); // приведёт к ошибке - } -}; - -var admin = user; -user = null; - -admin.sayHi(); // упс! внутри sayHi обращение по старому имени, ошибка! -``` - -Использование `this` гарантирует, что функция работает именно с тем объектом, в контексте которого вызвана. - -Через `this` метод может не только обратиться к любому свойству объекта, но и передать куда-то ссылку на сам объект целиком: - -```js -//+ run no-beautify -var user = { - name: 'Василий', - -*!* - sayHi: function() { - showName(this); // передать текущий объект в showName - } -*/!* -}; - -function showName(namedObj) { - alert( namedObj.name ); -} - -user.sayHi(); // Василий -``` - -## Подробнее про this - -Любая функция может иметь в себе `this`. Совершенно неважно, объявлена ли она в объекте или отдельно от него. - -Значение `this` называется *контекстом вызова* и будет определено в момент вызова функции. - -Например, такая функция, объявленная без объекта, вполне допустима: - -```js -function sayHi() { - alert( *!*this.firstName*/!* ); -} -``` - -Эта функция ещё не знает, каким будет `this`. Это выяснится при выполнении программы. - -**Если одну и ту же функцию запускать в контексте разных объектов, она будет получать разный `this`:** - -```js -//+ run no-beautify -var user = { firstName: "Вася" }; -var admin = { firstName: "Админ" }; - -function func() { - alert( this.firstName ); -} - -user.f = func; -admin.g = func; - -*!* -// this равен объекту перед точкой: -user.f(); // Вася -admin.g(); // Админ -admin['g'](); // Админ (не важно, доступ к объекту через точку или квадратные скобки) -*/!* -``` - -Итак, значение `this` не зависит от того, как функция была создана, оно определяется исключительно в момент вызова. - -## Значение this при вызове без контекста - -Если функция использует `this` -- это подразумевает работу с объектом. Но и прямой вызов `func()` технически возможен. - -Как правило, такая ситуация возникает при ошибке в разработке. - -При этом `this` получает значение `window`, глобального объекта: - -```js -//+ run -function func() { - alert( this ); // выведет [object Window] или [object global] -} - -func(); -``` - -Таково поведение в старом стандарте. - -А в режиме `use strict` вместо глобального объекта `this` будет `undefined`: - -```js -//+ run -function func() { - "use strict"; - alert( this ); // выведет undefined (кроме IE9-) -} - -func(); -``` - -Обычно если в функции используется `this`, то она, всё же, служит для вызова в контексте объекта, так что такая ситуация -- скорее исключение. - -## Ссылочный тип - -Контекст `this` никак не привязан к функции, даже если она создана в объявлении объекта. Чтобы `this` передался, нужно вызвать функцию именно через точку (или квадратные скобки). - -Любой более хитрый вызов приведёт к потере контекста, например: - -```js -//+ run no-beautify -var user = { - name: "Вася", - hi: function() { alert(this.name); }, - bye: function() { alert("Пока"); } -}; - -user.hi(); // Вася (простой вызов работает) - -*!* -// а теперь вызовем user.hi или user.bye в зависимости от имени -(user.name == "Вася" ? user.hi : user.bye)(); // undefined -*/!* -``` - -В последней строке примера метод получен в результате выполнения тернарного оператора и тут же вызван. Но `this` при этом теряется. - -Если хочется понять, почему, то причина кроется в деталях работы вызова `obj.method()`. - -Он ведь, на самом деле, состоит из двух независимых операций: точка `.` -- получение свойства и скобки `()` -- его вызов (предполагается, что это функция). - -Функция, как мы говорили раньше, сама по себе не запоминает контекст. Чтобы "донести его" до скобок, JavaScript применяет "финт ушами" -- точка возвращает не функцию, а значение специального "ссылочного" типа [Reference Type](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-reference-specification-type). - -Этот тип представляет собой связку "base-name-strict", где: -
      -
    • *base* -- как раз объект,
    • -
    • *name* -- имя свойства,
    • -
    • *strict* -- вспомогательный флаг для передачи `use strict`.
    • -
    - -То есть, ссылочный тип (Reference Type) -- это своеобразное "три-в-одном". Он существует исключительно для целей спецификации, мы его не видим, поскольку любой оператор тут же от него избавляется: - -
      -
    • Скобки `()` получают из `base` значение свойства `name` и вызывают в контексте base.
    • -
    • Другие операторы получают из `base` значение свойства `name` и используют, а остальные компоненты игнорируют.
    • -
    - -Поэтому любая операция над результатом операции получения свойства, кроме вызова, приводит к потере контекста. - -Аналогично работает и получение свойства через квадратные скобки `obj[method]`. - - - diff --git a/1-js/6-objects-more/2-object-conversion/1-array-equals-string/solution.md b/1-js/6-objects-more/2-object-conversion/1-array-equals-string/solution.md deleted file mode 100644 index b7a70199..00000000 --- a/1-js/6-objects-more/2-object-conversion/1-array-equals-string/solution.md +++ /dev/null @@ -1,15 +0,0 @@ -Если с одной стороны -- объект, а с другой -- нет, то сначала приводится объект. - -В данном случае сравнение означает численное приведение. У массивов нет `valueOf`, поэтому вызывается `toString`, который возвращает список элементов через запятую. - -В данном случае, элемент только один - он и возвращается. Так что `['x']` становится `'x'`. Получилось `'x' == 'x'`, верно. - -P.S. -По той же причине верны равенства: - -```js -//+ run -alert( ['x', 'y'] == 'x,y' ); // true -alert( [] == '' ); // true -``` - diff --git a/1-js/6-objects-more/2-object-conversion/1-array-equals-string/task.md b/1-js/6-objects-more/2-object-conversion/1-array-equals-string/task.md deleted file mode 100644 index 190bbeb4..00000000 --- a/1-js/6-objects-more/2-object-conversion/1-array-equals-string/task.md +++ /dev/null @@ -1,11 +0,0 @@ -# ['x'] == 'x' - -[importance 5] - -Почему результат `true` ? - -```js -//+ run -alert( ['x'] == 'x' ); -``` - diff --git a/1-js/6-objects-more/2-object-conversion/2-tostring-valueof/solution.md b/1-js/6-objects-more/2-object-conversion/2-tostring-valueof/solution.md deleted file mode 100644 index 9b2108d0..00000000 --- a/1-js/6-objects-more/2-object-conversion/2-tostring-valueof/solution.md +++ /dev/null @@ -1,10 +0,0 @@ -# Первый alert(foo) - -Возвращает строковое представление объекта, используя `toString`, т.е. `"foo"`. - -# Второй alert(foo + 1) -Оператор `'+'` преобразует объект к примитиву, используя `valueOf`, так что результат: `3`. - -# Третий alert(foo + '3') - -То же самое, что и предыдущий случай, объект превращается в примитив `2`. Затем происходит сложение `2 + '3'`. Оператор `'+'` при сложении чего-либо со строкой приводит и второй операнд к строке, а затем применяет конкатенацию, так что результат -- строка `"23"`. \ No newline at end of file diff --git a/1-js/6-objects-more/2-object-conversion/2-tostring-valueof/task.md b/1-js/6-objects-more/2-object-conversion/2-tostring-valueof/task.md deleted file mode 100644 index 86bd17cb..00000000 --- a/1-js/6-objects-more/2-object-conversion/2-tostring-valueof/task.md +++ /dev/null @@ -1,24 +0,0 @@ -# Преобразование - -[importance 5] - -Объявлен объект с `toString` и `valueOf`. - -Какими будут результаты `alert`? - -```js -var foo = { - toString: function() { - return 'foo'; - }, - valueOf: function() { - return 2; - } -}; - -alert( foo ); -alert( foo + 1 ); -alert( foo + "3" ); -``` - -Подумайте, прежде чем ответить. \ No newline at end of file diff --git a/1-js/6-objects-more/2-object-conversion/3-compare-empty-arrays/solution.md b/1-js/6-objects-more/2-object-conversion/3-compare-empty-arrays/solution.md deleted file mode 100644 index ef69d31c..00000000 --- a/1-js/6-objects-more/2-object-conversion/3-compare-empty-arrays/solution.md +++ /dev/null @@ -1,34 +0,0 @@ -# Ответ по первому равенству - -Два объекта равны только тогда, когда это один и тот же объект. - -В первом равенстве создаются два массива, это разные объекты, так что они неравны. - -# Ответ по второму равенству - -
      -
    1. Первым делом, обе части сравнения вычисляются. Справа находится `![]`. Логическое НЕ `'!'` преобразует аргумент к логическому типу. Массив является объектом, так что это `true`. Значит, правая часть становится `![] = !true = false`. Так что получили: - -```js -alert( [] == false ); -``` - -
    2. -
    3. Проверка равенства между объектом и примитивом вызывает численное преобразование объекта. - -У массива нет `valueOf`, сработает `toString` и преобразует массив в список элементов, то есть - в пустую строку: - -```js -alert( '' == false ); -``` - -
    4. -
    5. Сравнение различных типов вызывает численное преобразование слева и справа: - -```js -alert( 0 == 0 ); -``` - -Теперь результат очевиден. -
    6. -
    \ No newline at end of file diff --git a/1-js/6-objects-more/2-object-conversion/3-compare-empty-arrays/task.md b/1-js/6-objects-more/2-object-conversion/3-compare-empty-arrays/task.md deleted file mode 100644 index 6945834b..00000000 --- a/1-js/6-objects-more/2-object-conversion/3-compare-empty-arrays/task.md +++ /dev/null @@ -1,13 +0,0 @@ -# Почему [] == [] неверно, а [ ] == ![ ] верно? - -[importance 5] - -Почему первое равенство -- неверно, а второе -- верно? - -```js -//+ run -alert( [] == [] ); // false -alert( [] == ![] ); // true -``` - -Какие преобразования происходят при вычислении? \ No newline at end of file diff --git a/1-js/6-objects-more/2-object-conversion/4-object-types-conversion-questions/solution.md b/1-js/6-objects-more/2-object-conversion/4-object-types-conversion-questions/solution.md deleted file mode 100644 index 3d7c6689..00000000 --- a/1-js/6-objects-more/2-object-conversion/4-object-types-conversion-questions/solution.md +++ /dev/null @@ -1,35 +0,0 @@ - - -```js -//+ no-beautify -new Date(0) - 0 = 0 // (1) -new Array(1)[0] + "" = "undefined" // (2) -({})[0]
 = undefined // (3) -[1] + 1 = "11" // (4) -[1,2] + [3,4] = "1,23,4" // (5) -[] + null + 1 = "null1" // (6) -[[0]][0][0] = 0 // (7) -({} + {}) = "[object Object][object Object]" // (8) -``` - -
      -
    1. `new Date(0)` -- дата, созданная по миллисекундам и соответствующая 0мс от 1 января 1970 года 00:00:00 UTC. Оператор минус `-` преобразует дату обратно в число миллисекунд, то есть в `0`.
    2. -
    3. `new Array(num)` при вызове с единственным аргументом-числом создаёт массив данной длины, без элементов. Поэтому его нулевой элемент равен `undefined`, при сложении со строкой получается строка `"undefined"`.
    4. -
    5. Фигурные скобки -- это создание пустого объекта, у него нет свойства `'0'`. Так что значением будет `undefined`. -Обратите внимание на внешние, круглые скобки. Если их убрать и запустить `{}[0]` в отладочной консоли браузера -- будет `0`, т.к. скобки `{}` будут восприняты как пустой блок кода, после которого идёт массив.
    6. -
    7. Массив преобразуется в строку `"1"`. Оператор `"+"` при сложении со строкой приводит второй аргумент к строке -- значит будет `"1" + "1" = "11"`.
    8. -
    9. Массивы приводятся к строке и складываются.
    10. -
    11. Массив преобразуется в пустую строку `"" + null + 1`, оператор `"+"` видит, что слева строка и преобразует `null` к строке, получается `"null" + 1`, и в итоге `"null1"`.
    12. -
    13. `[[0]]` -- это вложенный массив `[0]` внутри внешнего `[ ]`. Затем мы берём от него нулевой элемент, и потом еще раз. - -Если это непонятно, то посмотрите на такой пример: - -```js -//+ no-beautify -alert( [1,[0],2][1] ); -``` - -Квадратные скобки после массива/объекта обозначают не другой массив, а взятие элемента. -
    14. -
    15. Каждый объект преобразуется к примитиву. У встроенных объектов `Object` нет подходящего `valueOf`, поэтому используется `toString`, так что складываются в итоге строковые представления объектов.
    16. -
    diff --git a/1-js/6-objects-more/2-object-conversion/4-object-types-conversion-questions/task.md b/1-js/6-objects-more/2-object-conversion/4-object-types-conversion-questions/task.md deleted file mode 100644 index 85f767a5..00000000 --- a/1-js/6-objects-more/2-object-conversion/4-object-types-conversion-questions/task.md +++ /dev/null @@ -1,18 +0,0 @@ -# Вопросник по преобразованиям, для объектов - -[importance 5] - -Подумайте, какой результат будет у выражений ниже. Когда закончите -- сверьтесь с решением. - -```js -//+ no-beautify -new Date(0) - 0 -new Array(1)[0] + "" -({})[0]
 -[1] + 1 -[1,2] + [3,4] -[] + null + 1 -[[0]][0][0] -({} + {}) -``` - diff --git a/1-js/6-objects-more/2-object-conversion/5-sum-many-brackets/solution.md b/1-js/6-objects-more/2-object-conversion/5-sum-many-brackets/solution.md deleted file mode 100644 index 4b36c185..00000000 --- a/1-js/6-objects-more/2-object-conversion/5-sum-many-brackets/solution.md +++ /dev/null @@ -1,61 +0,0 @@ -# Подсказка - -Чтобы `sum(1)`, а также `sum(1)(2)` можно было вызвать новыми скобками -- результатом `sum` должна быть функция. - -Но эта функция также должна уметь превращаться в число. Для этого нужно дать ей соответствующий `valueOf`. А если мы хотим, чтобы и в строковом контексте она вела себя так же -- то `toString`. - -# Решение - -Функция, которая возвращается `sum`, должна накапливать значение при каждом вызове. - -Удобнее всего хранить его в замыкании, в переменной `currentSum`. Каждый вызов прибавляет к ней очередное значение: - -```js -//+ run -function sum(a) { - - var currentSum = a; - - function f(b) { - currentSum += b; - return f; - } - - f.toString = function() { - return currentSum; - }; - - return f; -} - -alert( sum(1)(2) ); // 3 -alert( sum(5)(-1)(2) ); // 6 -alert( sum(6)(-1)(-2)(-3) ); // 0 -alert( sum(0)(1)(2)(3)(4)(5) ); // 15 -``` - -При внимательном взгляде на решение легко заметить, что функция `sum` срабатывает только один раз. Она возвращает функцию `f`. - -Затем, при каждом запуске функция `f` добавляет параметр к сумме `currentSum`, хранящейся в замыкании, и возвращает сама себя. - -**В последней строчке `f` нет рекурсивного вызова.** - -Вот так была бы рекурсия: - -```js -function f(b) { - currentSum += b; - return f(); // <-- подвызов -} -``` - -А в нашем случае, мы просто возвращаем саму функцию, ничего не вызывая. - -```js -function f(b) { - currentSum += b; - return f; // <-- не вызывает сама себя, а возвращает ссылку на себя -} -``` - -Эта `f` используется при следующем вызове, опять возвратит себя, и так сколько нужно раз. Затем, при использовании в строчном или численном контексте -- сработает `toString`, который вернет текущую сумму `currentSum`. \ No newline at end of file diff --git a/1-js/6-objects-more/2-object-conversion/5-sum-many-brackets/task.md b/1-js/6-objects-more/2-object-conversion/5-sum-many-brackets/task.md deleted file mode 100644 index b220c704..00000000 --- a/1-js/6-objects-more/2-object-conversion/5-sum-many-brackets/task.md +++ /dev/null @@ -1,17 +0,0 @@ -# Сумма произвольного количества скобок - -[importance 2] - -Напишите функцию `sum`, которая будет работать так: - -```js -sum(1)(2) == 3; // 1 + 2 -sum(1)(2)(3) == 6; // 1 + 2 + 3 -sum(5)(-1)(2) == 6 -sum(6)(-1)(-2)(-3) == 0 -sum(0)(1)(2)(3)(4)(5) == 15 -``` - -Количество скобок может быть любым. - -Пример такой функции для двух аргументов -- есть в решении задачи [](/task/closure-sum). \ No newline at end of file diff --git a/1-js/6-objects-more/2-object-conversion/article.md b/1-js/6-objects-more/2-object-conversion/article.md deleted file mode 100644 index e473266b..00000000 --- a/1-js/6-objects-more/2-object-conversion/article.md +++ /dev/null @@ -1,281 +0,0 @@ -# Преобразование объектов: toString и valueOf - -Ранее, в главе [](/types-conversion) мы рассматривали преобразование типов для примитивов. Теперь добавим в нашу картину мира объекты. - -Бывают операции, при которых объект должен быть преобразован в примитив. -[cut] -Например: - -
      -
    • Строковое преобразование -- если объект выводится через `alert(obj)`.
    • -
    • Численное преобразование -- при арифметических операциях, сравнении с примитивом.
    • -
    • Логическое преобразование -- при `if(obj)` и других логических операциях.
    • -
    - -Рассмотрим эти преобразования по очереди. - -## Логическое преобразование - -Проще всего -- с логическим преобразованием. - -**Любой объект в логическом контексте -- `true`, даже если это пустой массив `[]` или объект `{}`.** - -```js -//+ run -if ({} && []) { - alert( "Все объекты - true!" ); // alert сработает -} -``` - -## Строковое преобразование - -Строковое преобразование проще всего увидеть, если вывести объект при помощи `alert`: - -```js -//+ run -var user = { - firstName: 'Василий' -}; - -alert( user ); // [object Object] -``` - -Как видно, содержимое объекта не вывелось. Это потому, что стандартным строковым представлением пользовательского объекта является строка `"[object Object]"`. - -Такой вывод объекта не содержит интересной информации. Поэтому имеет смысл его поменять на что-то более полезное. - -**Если в объекте присутствует метод `toString`, который возвращает примитив, то он используется для преобразования.** - -```js -//+ run -var user = { - - firstName: 'Василий', - - *!*toString:*/!* function() { - return 'Пользователь ' + this.firstName; - } -}; - -alert( user ); // Пользователь Василий -``` - -[smart header="Результатом `toString` может быть любой примитив"] -Метод `toString` не обязан возвращать именно строку. - -Его результат может быть любого примитивного типа. Например, это может быть число, как в примере ниже: - -```js -//+ run -var obj = { - toString: function() { - return 123; - } -}; - -alert( obj ); // 123 -``` - -Поэтому мы и называем его здесь *"строковое преобразование"*, а не "преобразование к строке". -[/smart] - -Все объекты, включая встроенные, имеют свои реализации метода `toString`, например: - -```js -//+ run -alert( [1, 2] ); // toString для массивов выводит список элементов "1,2" -alert( new Date ); // toString для дат выводит дату в виде строки -alert( function() {} ); // toString для функции выводит её код -``` - -## Численное преобразование - -Для численного преобразования объекта используется метод `valueOf`, а если его нет -- то `toString`: - -```js -//+ run -var room = { - number: 777, - - valueOf: function() { return this.number; }, - toString: function() { return this.number; } -}; - -alert( +room ); // 777, *!*вызвался valueOf*/!* - -delete room.valueOf; // *!*valueOf удалён*/!* - -alert( +room ); // 777, *!*вызвался toString*/!* -``` - -Метод `valueOf` обязан возвращать примитивное значение, иначе его результат будет проигнорирован. При этом -- не обязательно числовое. - -[smart header="У большинства объектов нет `valueOf`"] -У большинства встроенных объектов такого `valueOf` нет, поэтому численное и строковое преобразования для них работают одинаково. - -Исключением является объект `Date`, который поддерживает оба типа преобразований: - -```js -//+ run -alert( new Date() ); // toString: Дата в виде читаемой строки -alert( +new Date() ); // valueOf: кол-во миллисекунд, прошедших с 01.01.1970 -``` - -[/smart] - -[smart header="Детали спецификации"] -Если посмотреть в стандарт, то в пункте [15.2.4.4](http://es5.github.com/x15.2.html#x15.2.4.4) говорится о том, что `valueOf` есть у любых объектов. Но он ничего не делает, просто возвращает сам объект (не-примитивное значение!), а потому игнорируется. -[/smart] - -## Две стадии преобразования - -Итак, объект преобразован в примитив при помощи `toString` или `valueOf`. - -Но на этом преобразования не обязательно заканчиваются. Вполне возможно, что в процессе вычислений этот примитив будет преобразован во что-то другое. - -Например, рассмотрим применение к объекту операции `==`: - -```js -//+ run -var obj = { - valueOf: function() { - return 1; - } -}; - -alert( obj == true ); // true -``` - -Объект `obj` был сначала преобразован в примитив, используя численное преобразование, получилось `1 == true`. - -Далее, так как значения всё ещё разных типов, применяются правила преобразования примитивов, результат: `true`. - -То же самое -- при сложении с объектом при помощи `+`: - -```js -//+ run -var obj = { - valueOf: function() { - return 1; - } -}; - -alert( obj + "test" ); // 1test -``` - -Или вот, для разности объектов: - -```js -//+ run -var a = { - valueOf: function() { - return "1"; - } -}; -var b = { - valueOf: function() { - return "2"; - } -}; - -alert( a + b ); // "12" -alert( a - b ); // "1" - "2" = -1 -``` - -[warn header="Исключение: `Date`"] -Объект `Date`, по историческим причинам, является исключением. - -Бинарный оператор плюс `+` обычно использует числовое преобразование и метод `valueOf`. Как мы уже знаем, если подходящего `valueOf` нет (а его нет у большинства объектов), то используется `toString`, так что в итоге преобразование происходит к строке. Но если есть `valueOf`, то используется `valueOf`. Выше в примере как раз `a + b` это демонстрируют. - -У объектов `Date` есть и `valueOf` -- возвращает количество миллисекунд, и `toString` -- возвращает строку с датой. - -...Но оператор `+` для `Date` использует именно `toString` (хотя должен бы `valueOf`). - -Это и есть исключение: - -```js -//+ run -// бинарный плюс для даты toString, для остальных объектов valueOf -alert( new Date + "" ); // "строка даты" -``` - -Других подобных исключений нет. -[/warn] - -[warn header="Как испугать Java-разработчика"] -В языке Java (это не JavaScript, другой язык, здесь приведён для примера) логические значения можно создавать, используя синтаксис `new Boolean(true/false)`, например `new Boolean(true)`. - -В JavaScript тоже есть подобная возможность, которая возвращает "объектную обёртку" для логического значения. - -Эта возможность давно существует лишь для совместимости, она и не используется на практике, поскольку приводит к странным результатам. Некоторые из них могут сильно удивить человека, не привыкшего к JavaScript, например: - -```js -//+ run -var value = new Boolean(false); -if (value) { - alert( true ); // сработает! -} -``` - -Почему запустился `alert`? Ведь в `if` находится `false`... Проверим: - -```js -//+ run -var value = new Boolean(false); - -*!* -alert( value ); // выводит false, все ок.. -*/!* - -if (value) { - alert( true ); // ..но тогда почему выполняется alert в if ?!? -} -``` - -Дело в том, что `new Boolean` -- это не примитивное значение, а объект. Поэтому в логическом контексте он преобразуется к `true`, в результате работает первый пример. - -А второй пример вызывает `alert`, который преобразует объект к строке, и он становится `"false"`. - -**В JavaScript вызовы `new Boolean/String/Number` не используются, а используются простые вызовы соответствующих функций, они преобразуют значение в примитив нужного типа, например `Boolean(val) === !!val`.** -[/warn] - -## Итого - -
      -
    • В логическом контексте объект -- всегда `true`.
    • -
    • При строковом преобразовании объекта используется его метод `toString`. Он должен возвращать примитивное значение, причём не обязательно именно строку. -
    • -
    • Для численного преобразования используется метод `valueOf`, который также может возвратить любое примитивное значение. У большинства объектов `valueOf` не работает (возвращает сам объект и потому игнорируется), при этом для численного преобразования используется `toString`.
    • -
    - -Полный алгоритм преобразований есть в спецификации EcmaScript, смотрите пункты [11.8.5](http://es5.github.com/x11.html#x11.8.5), [11.9.3](http://es5.github.com/x11.html#x11.9.3), а также [9.1](http://es5.github.com/x9.html#x9.1) и [9.3](http://es5.github.com/x9.html#x9.3). - - -Заметим, для полноты картины, что некоторые тесты знаний в интернет предлагают вопросы типа: -```js -//+ no-beautify -{}[0] // чему равно? -{} + {} // а так? -``` - -Если вы запустите эти выражения в консоли, то результат может показаться странным. Подвох здесь в том, что если фигурные скобки `{...}` идут не в выражении, а в основном потоке кода, то JavaScript считает, что это не объект, а "блок кода" (как `if`, `for`, но без оператора, просто группировка команд вместе, используется редко). - -Вот блок кода с командой: -```js -//+run -{ - alert("Блок") -} -``` - -А если команду изъять, то будет пустой блок `{}`, который ничего не делает. Два примера выше как раз содержат пустой блок в начале, который ничего не делает. Иначе говоря: -```js -//+ no-beautify -{}[0] // то же что и: [0] -{} + {} // то же что и: + {} -``` - -То есть, такие вопросы -- не на преобразование типов, а на понимание, что если `{ ... }` находится вне выражений, то это не объект, а блок. - - - diff --git a/1-js/6-objects-more/3-constructor-new/1-two-functions-one-object/solution.md b/1-js/6-objects-more/3-constructor-new/1-two-functions-one-object/solution.md deleted file mode 100644 index 5b27cec2..00000000 --- a/1-js/6-objects-more/3-constructor-new/1-two-functions-one-object/solution.md +++ /dev/null @@ -1,19 +0,0 @@ -Да, возможны. - -Они должны возвращать одинаковый объект. При этом если функция возвращает объект, то `this` не используется. - -Например, они могут вернуть один и тот же объект `obj`, определённый снаружи: - -```js -//+ run no-beautify -var obj = {}; - -function A() { return obj; } -function B() { return obj; } - -var a = new A; -var b = new B; - -alert( a == b ); // true -``` - diff --git a/1-js/6-objects-more/3-constructor-new/1-two-functions-one-object/task.md b/1-js/6-objects-more/3-constructor-new/1-two-functions-one-object/task.md deleted file mode 100644 index 72c4e8eb..00000000 --- a/1-js/6-objects-more/3-constructor-new/1-two-functions-one-object/task.md +++ /dev/null @@ -1,18 +0,0 @@ -# Две функции один объект - -[importance 2] - -Возможны ли такие функции `A` и `B` в примере ниже, что соответствующие объекты `a,b` равны (см. код ниже)? - -```js -//+ no-beautify -function A() { ... } -function B() { ... } - -var a = new A; -var b = new B; - -alert( a == b ); // true -``` - -Если да -- приведите пример кода с такими функциями. \ No newline at end of file diff --git a/1-js/6-objects-more/3-constructor-new/2-calculator-constructor/_js.view/solution.js b/1-js/6-objects-more/3-constructor-new/2-calculator-constructor/_js.view/solution.js deleted file mode 100644 index 3b51b2e6..00000000 --- a/1-js/6-objects-more/3-constructor-new/2-calculator-constructor/_js.view/solution.js +++ /dev/null @@ -1,15 +0,0 @@ -function Calculator() { - - this.read = function() { - this.a = +prompt('a?', 0); - this.b = +prompt('b?', 0); - }; - - this.sum = function() { - return this.a + this.b; - }; - - this.mul = function() { - return this.a * this.b; - }; -} \ No newline at end of file diff --git a/1-js/6-objects-more/3-constructor-new/2-calculator-constructor/_js.view/test.js b/1-js/6-objects-more/3-constructor-new/2-calculator-constructor/_js.view/test.js deleted file mode 100644 index ef881c45..00000000 --- a/1-js/6-objects-more/3-constructor-new/2-calculator-constructor/_js.view/test.js +++ /dev/null @@ -1,25 +0,0 @@ -sinon.stub(window, "prompt") - -prompt.onCall(0).returns("2"); -prompt.onCall(1).returns("3"); - -describe("calculator", function() { - var calculator; - before(function() { - calculator = new Calculator(); - calculator.read(); - }); - - it("при вводе 2 и 3 сумма равна 5", function() { - assert.equal(calculator.sum(), 5); - }); - - it("при вводе 2 и 3 произведение равно 6", function() { - assert.equal(calculator.mul(), 6); - }); - -}); - -after(function() { - prompt.restore(); -}); \ No newline at end of file diff --git a/1-js/6-objects-more/3-constructor-new/2-calculator-constructor/solution.md b/1-js/6-objects-more/3-constructor-new/2-calculator-constructor/solution.md deleted file mode 100644 index a78010d9..00000000 --- a/1-js/6-objects-more/3-constructor-new/2-calculator-constructor/solution.md +++ /dev/null @@ -1,27 +0,0 @@ - - -```js -//+ run demo -function Calculator() { - - this.read = function() { - this.a = +prompt('a?', 0); - this.b = +prompt('b?', 0); - }; - - this.sum = function() { - return this.a + this.b; - }; - - this.mul = function() { - return this.a * this.b; - }; -} - -var calculator = new Calculator(); -calculator.read(); - -alert( "Сумма=" + calculator.sum() ); -alert( "Произведение=" + calculator.mul() ); -``` - diff --git a/1-js/6-objects-more/3-constructor-new/2-calculator-constructor/task.md b/1-js/6-objects-more/3-constructor-new/2-calculator-constructor/task.md deleted file mode 100644 index 31258cb7..00000000 --- a/1-js/6-objects-more/3-constructor-new/2-calculator-constructor/task.md +++ /dev/null @@ -1,22 +0,0 @@ -# Создать Calculator при помощи конструктора - -[importance 5] - -Напишите *функцию-конструктор* `Calculator`, которая создает объект с тремя методами: -
      -
    • Метод `read()` запрашивает два значения при помощи `prompt` и запоминает их в свойствах объекта.
    • -
    • Метод `sum()` возвращает сумму запомненных свойств.
    • -
    • Метод `mul()` возвращает произведение запомненных свойств.
    • -
    - -Пример использования: - -```js -var calculator = new Calculator(); -calculator.read(); - -alert( "Сумма=" + calculator.sum() ); -alert( "Произведение=" + calculator.mul() ); -``` - -[demo /] diff --git a/1-js/6-objects-more/3-constructor-new/3-accumulator/_js.view/solution.js b/1-js/6-objects-more/3-constructor-new/3-accumulator/_js.view/solution.js deleted file mode 100644 index bd744597..00000000 --- a/1-js/6-objects-more/3-constructor-new/3-accumulator/_js.view/solution.js +++ /dev/null @@ -1,8 +0,0 @@ -function Accumulator(startingValue) { - this.value = startingValue; - - this.read = function() { - this.value += +prompt('Сколько добавлять будем?', 0); - }; - -} \ No newline at end of file diff --git a/1-js/6-objects-more/3-constructor-new/3-accumulator/_js.view/test.js b/1-js/6-objects-more/3-constructor-new/3-accumulator/_js.view/test.js deleted file mode 100644 index aa651b11..00000000 --- a/1-js/6-objects-more/3-constructor-new/3-accumulator/_js.view/test.js +++ /dev/null @@ -1,37 +0,0 @@ -describe("Accumulator(1)", function() { - var accumulator; - before(function() { - accumulator = new Accumulator(1); - }); - - beforeEach(function() { - sinon.stub(window, "prompt") - }); - - afterEach(function() { - prompt.restore(); - }); - - it("начальное значение 1", function() { - assert.equal(accumulator.value, 1); - }); - - it("после ввода 0 значение 1", function() { - prompt.returns("0"); - accumulator.read(); - assert.equal(accumulator.value, 1); - }); - - it("после ввода 1 значение 2", function() { - prompt.returns("1"); - accumulator.read(); - assert.equal(accumulator.value, 2); - }); - - it("после ввода 2 значение 4", function() { - prompt.returns("2"); - accumulator.read(); - assert.equal(accumulator.value, 4); - }); - -}); \ No newline at end of file diff --git a/1-js/6-objects-more/3-constructor-new/3-accumulator/solution.md b/1-js/6-objects-more/3-constructor-new/3-accumulator/solution.md deleted file mode 100644 index f5b2ba43..00000000 --- a/1-js/6-objects-more/3-constructor-new/3-accumulator/solution.md +++ /dev/null @@ -1,19 +0,0 @@ - - -```js -//+ run demo -function Accumulator(startingValue) { - this.value = startingValue; - - this.read = function() { - this.value += +prompt('Сколько добавлять будем?', 0); - }; - -} - -var accumulator = new Accumulator(1); -accumulator.read(); -accumulator.read(); -alert( accumulator.value ); -``` - diff --git a/1-js/6-objects-more/3-constructor-new/3-accumulator/task.md b/1-js/6-objects-more/3-constructor-new/3-accumulator/task.md deleted file mode 100644 index 7852e561..00000000 --- a/1-js/6-objects-more/3-constructor-new/3-accumulator/task.md +++ /dev/null @@ -1,24 +0,0 @@ -# Создать Accumulator при помощи конструктора - -[importance 5] - -Напишите *функцию-конструктор* `Accumulator(startingValue)`. -Объекты, которые она создает, должны хранить текущую сумму и прибавлять к ней то, что вводит посетитель. - -Более формально, объект должен: -
      -
    • Хранить текущее значение в своём свойстве `value`. Начальное значение свойства `value` ставится конструктором равным `startingValue`.
    • -
    • Метод `read()` вызывает `prompt`, принимает число и прибавляет его к свойству `value`.
    • -
    -Таким образом, свойство `value` является текущей суммой всего, что ввел посетитель при вызовах метода `read()`, с учетом начального значения `startingValue`. - -Ниже вы можете посмотреть работу кода: - -```js -var accumulator = new Accumulator(1); // начальное значение 1 -accumulator.read(); // прибавит ввод prompt к текущему значению -accumulator.read(); // прибавит ввод prompt к текущему значению -alert( accumulator.value ); // выведет текущее значение -``` - -[demo /] diff --git a/1-js/6-objects-more/3-constructor-new/4-calculator-extendable/_js.view/solution.js b/1-js/6-objects-more/3-constructor-new/4-calculator-extendable/_js.view/solution.js deleted file mode 100644 index 4bf9f22b..00000000 --- a/1-js/6-objects-more/3-constructor-new/4-calculator-extendable/_js.view/solution.js +++ /dev/null @@ -1,29 +0,0 @@ -function Calculator() { - - var methods = { - "-": function(a, b) { - return a - b; - }, - "+": function(a, b) { - return a + b; - } - }; - - this.calculate = function(str) { - - var split = str.split(' '), - a = +split[0], - op = split[1], - b = +split[2] - - if (!methods[op] || isNaN(a) || isNaN(b)) { - return NaN; - } - - return methods[op](+a, +b); - } - - this.addMethod = function(name, func) { - methods[name] = func; - }; -} \ No newline at end of file diff --git a/1-js/6-objects-more/3-constructor-new/4-calculator-extendable/_js.view/test.js b/1-js/6-objects-more/3-constructor-new/4-calculator-extendable/_js.view/test.js deleted file mode 100644 index 2c6891a9..00000000 --- a/1-js/6-objects-more/3-constructor-new/4-calculator-extendable/_js.view/test.js +++ /dev/null @@ -1,26 +0,0 @@ -var calculator; -before(function() { - calculator = new Calculator; -}); - -it("calculate(12 + 34) = 46", function() { - assert.equal(calculator.calculate("12 + 34"), 46); -}); - -it("calculate(34 - 12) = 22", function() { - assert.equal(calculator.calculate("34 - 12"), 22); -}); - -it("добавили умножение: calculate(2 * 3) = 6", function() { - calculator.addMethod("*", function(a, b) { - return a * b; - }); - assert.equal(calculator.calculate("2 * 3"), 6); -}); - -it("добавили возведение в степень: calculate(2 ** 3) = 8", function() { - calculator.addMethod("**", function(a, b) { - return Math.pow(a, b); - }); - assert.equal(calculator.calculate("2 ** 3"), 8); -}); \ No newline at end of file diff --git a/1-js/6-objects-more/3-constructor-new/4-calculator-extendable/solution.md b/1-js/6-objects-more/3-constructor-new/4-calculator-extendable/solution.md deleted file mode 100644 index 3e5f26e5..00000000 --- a/1-js/6-objects-more/3-constructor-new/4-calculator-extendable/solution.md +++ /dev/null @@ -1,55 +0,0 @@ - - -```js -//+ run -function Calculator() { - - var methods = { - "-": function(a, b) { - return a - b; - }, - "+": function(a, b) { - return a + b; - } - }; - - this.calculate = function(str) { - - var split = str.split(' '), - a = +split[0], - op = split[1], - b = +split[2] - - if (!methods[op] || isNaN(a) || isNaN(b)) { - return NaN; - } - - return methods[op](+a, +b); - } - - this.addMethod = function(name, func) { - methods[name] = func; - }; -} - -var calc = new Calculator; - -calc.addMethod("*", function(a, b) { - return a * b; -}); -calc.addMethod("/", function(a, b) { - return a / b; -}); -calc.addMethod("**", function(a, b) { - return Math.pow(a, b); -}); - -var result = calc.calculate("2 ** 3"); -alert( result ); // 8 -``` - -
      -
    • Обратите внимание на хранение методов. Они просто добавляются к внутреннему объекту.
    • -
    • Все проверки и преобразование к числу производятся в методе `calculate`. В дальнейшем он может быть расширен для поддержки более сложных выражений.
    • -
    - diff --git a/1-js/6-objects-more/3-constructor-new/4-calculator-extendable/task.md b/1-js/6-objects-more/3-constructor-new/4-calculator-extendable/task.md deleted file mode 100644 index 244a932c..00000000 --- a/1-js/6-objects-more/3-constructor-new/4-calculator-extendable/task.md +++ /dev/null @@ -1,47 +0,0 @@ -# Создайте калькулятор - -[importance 5] - -Напишите конструктор `Calculator`, который создаёт расширяемые объекты-калькуляторы. - -Эта задача состоит из двух частей, которые можно решать одна за другой. -
      -
    1. Первый шаг задачи: вызов `calculate(str)` принимает строку, например "1 + 2", с жёстко заданным форматом "ЧИСЛО операция ЧИСЛО" (по одному пробелу вокруг операции), и возвращает результат. Понимает плюс `+` и минус `-`. - -Пример использования: - -```js -var calc = new Calculator; - -alert( calc.calculate("3 + 7") ); // 10 -``` - -
    2. -
    3. Второй шаг -- добавить калькулятору метод `addMethod(name, func)`, который учит калькулятор новой операции. Он получает имя операции `name` и функцию от двух аргументов `func(a,b)`, которая должна её реализовывать. - -Например, добавим операции умножить `*`, поделить `/` и возвести в степень `**`: - -```js -var powerCalc = new Calculator; -powerCalc.addMethod("*", function(a, b) { - return a * b; -}); -powerCalc.addMethod("/", function(a, b) { - return a / b; -}); -powerCalc.addMethod("**", function(a, b) { - return Math.pow(a, b); -}); - -var result = powerCalc.calculate("2 ** 3"); -alert( result ); // 8 -``` - -
    4. -
    - -
      -
    • Поддержка скобок и сложных математических выражений в этой задаче не требуется.
    • -
    • Числа и операции могут состоять из нескольких символов. Между ними ровно один пробел.
    • -
    • Предусмотрите обработку ошибок. Какая она должна быть - решите сами.
    • -
    \ No newline at end of file diff --git a/1-js/6-objects-more/3-constructor-new/article.md b/1-js/6-objects-more/3-constructor-new/article.md deleted file mode 100644 index f4ce62cf..00000000 --- a/1-js/6-objects-more/3-constructor-new/article.md +++ /dev/null @@ -1,216 +0,0 @@ -# Создание объектов через "new" - -Обычный синтаксис `{...}` позволяет создать один объект. Но зачастую нужно создать много однотипных объектов. - -Для этого используют "функции-конструкторы", запуская их при помощи специального оператора `new`. - -[cut] -## Конструктор - -Конструктором становится любая функция, вызванная через `new`. - -Например: - -```js -function Animal(name) { - this.name = name; - this.canWalk = true; -} - -*!* -var animal = new Animal("ёжик"); -*/!* -``` - -Заметим, что, технически, любая функция может быть использована как конструктор. То есть, любую функцию можно вызвать при помощи `new`. Как-то особым образом указывать, что она -- конструктор -- не надо. - -Но, чтобы выделить функции, задуманные как конструкторы, их называют с большой буквы: `Animal`, а не `animal`. - -Детальнее -- функция, запущенная через `new`, делает следующее: - -
      -
    1. Создаётся новый пустой объект.
    2. -
    3. Ключевое слово `this` получает ссылку на этот объект.
    4. -
    5. Функция выполняется. Как правило, она модифицирует `this`, добавляет методы, свойства.
    6. -
    7. Возвращается `this`.
    8. -
    - - -В результате вызова `new Animal("ёжик");` получаем такой объект: - -```js -animal = { - name: "ёжик", - canWalk: true -} -``` - -Иными словами, при вызове `new Animal` происходит что-то в таком духе (первая и последняя строка -- это то, что делает интерпретатор): - -```js -function Animal(name) { -*!* - // this = {}; -*/!* - - // в this пишем свойства, методы - this.name = name; - this.canWalk = true; - -*!* - // return this; -*/!* -} -``` - -Теперь многократными вызовами `new Animal` с разными параметрами мы можем создать столько объектов, сколько нужно. Поэтому такую функцию и называют *конструктором* -- она предназначена для "конструирования" объектов. - -[smart header="new function() { ... }"] -Иногда функцию-конструктор объявляют и тут же используют, вот так: -```js -var animal = new function() { - this.name = "Васька"; - this.canWalk = true; -}; -``` -Так делают, когда хотят создать единственный объект данного типа. Примере выше с тем же успехом можно было бы переписать как: -```js -var animal = { - name: "Васька", - canWalk: true -} -``` -...Но обычный синтаксис `{...}` не подходит, когда при создании свойств объекта нужны более сложные вычисления. Их можно проделать в функции-конструкторе и записать результат в `this`. -[/smart] - -## Правила обработки return - -Как правило, конструкторы ничего не возвращают. Их задача -- записать всё, что нужно, в `this`, который автоматически станет результатом. - -Но если явный вызов `return` всё же есть, то применяется простое правило: -
      -
    • При вызове `return` с объектом, будет возвращён он, а не `this`.
    • -
    • При вызове `return` с примитивным значением, оно будет отброшено.
    • -
    - -Иными словами, вызов `return` с объектом вернёт объект, а с чем угодно, кроме объекта -- возвратит, как обычно, `this`. - -Например, возврат объекта: - -```js -//+ run no-beautify -function BigAnimal() { - - this.name = "Мышь"; - - return { name: "Годзилла" }; // <-- возвратим объект -} - -alert( new BigAnimal().name ); // Годзилла, получили объект вместо this -``` - -А вот пример с возвратом строки: - -```js -//+ run -function BigAnimal() { - - this.name = "Мышь"; - - return "Годзилла"; // <-- возвратим примитив -} - -alert( new BigAnimal().name ); // Мышь, получили this (а Годзилла пропал) -``` - -Эта особенность работы `new` прописана в стандарте, но используется она весьма редко. - -[smart header="Можно без скобок"] -Кстати, при вызове `new` без аргументов скобки можно не ставить: - -```js -var animal = new BigAnimal; // <-- без скобок -// то же самое что -var animal = new BigAnimal(); -``` - -Не сказать, что выбрасывание скобок -- "хороший стиль", но такой синтаксис допустим стандартом. -[/smart] - -## Создание методов в конструкторе - -Использование функций для создания объекта дает большую гибкость. Можно передавать конструктору параметры, определяющие как его создавать, и он будет "клепать" объекты заданным образом. - -Добавим в создаваемый объект ещё и метод. - -Например, `new User(name)` создает объект с заданным значением свойства `name` и методом `sayHi`: - -```js -//+ run -function User(name) { - this.name = name; - - this.sayHi = function() { - alert( "Моё имя: " + this.name ); - }; -} - -*!* -var ivan = new User("Иван"); - -ivan.sayHi(); // Моё имя: Иван -*/!* - -/* -ivan = { - name: "Иван", - sayHi: функция -} -*/ -``` - -## Локальные переменные - -В функции-конструкторе бывает удобно объявить вспомогательные локальные переменные и вложенные функции, которые будут видны только внутри: - -```js -//+ run -function User(firstName, lastName) { -*!* - // вспомогательная переменная - var phrase = "Привет"; - - // вспомогательная вложенная функция - function getFullName() { - return firstName + " " + lastName; - } -*/!* - - this.sayHi = function() { - alert( phrase + ", " + getFullName() ); // использование - }; -} - -var vasya = new User("Вася", "Петров"); -vasya.sayHi(); // Привет, Вася Петров -``` - -Мы уже говорили об этом подходе ранее, в главе [](/closures-usage). - -Те функции и данные, которые должны быть доступны для внешнего кода, мы пишем в `this` -- и к ним можно будет обращаться, как например `vasya.sayHi()`, а вспомогательные, которые нужны только внутри самого объекта, сохраняем в локальной области видимости. - -[] - -## Итого - -Объекты могут быть созданы при помощи функций-конструкторов: - -
      -
    • Любая функция может быть вызвана с `new`, при этом она получает новый пустой объект в качестве `this`, в который она добавляет свойства. Если функция не решит возвратить свой объект, то её результатом будет `this`.
    • -
    • Функции, которые предназначены для создания объектов, называются *конструкторами*. Их названия пишут с большой буквы, чтобы отличать от обычных.
    • -
    - - - - - diff --git a/1-js/6-objects-more/4-descriptors-getters-setters/1-replace-property-getter/solution.md b/1-js/6-objects-more/4-descriptors-getters-setters/1-replace-property-getter/solution.md deleted file mode 100644 index f00b3bc8..00000000 --- a/1-js/6-objects-more/4-descriptors-getters-setters/1-replace-property-getter/solution.md +++ /dev/null @@ -1,48 +0,0 @@ - -```js -//+ run -function User(fullName) { - this.fullName = fullName; - - Object.defineProperties(this, { - - firstName: { - - get: function() { - return this.fullName.split(' ')[0]; - }, - - set: function(newFirstName) { - this.fullName = newFirstName + ' ' + this.lastName; - } - - }, - - lastName: { - - get: function() { - return this.fullName.split(' ')[1]; - }, - - set: function(newLastName) { - this.fullName = this.firstName + ' ' + newLastName; - } - - } - - - }); -} - -var vasya = new User("Василий Попкин"); - -// чтение firstName/lastName -alert( vasya.firstName ); // Василий -alert( vasya.lastName ); // Попкин - -// запись в lastName -vasya.lastName = 'Сидоров'; - -alert( vasya.fullName ); // Василий Сидоров -``` - diff --git a/1-js/6-objects-more/4-descriptors-getters-setters/1-replace-property-getter/task.md b/1-js/6-objects-more/4-descriptors-getters-setters/1-replace-property-getter/task.md deleted file mode 100644 index 81152200..00000000 --- a/1-js/6-objects-more/4-descriptors-getters-setters/1-replace-property-getter/task.md +++ /dev/null @@ -1,32 +0,0 @@ -# Добавить get/set-свойства - -[importance 5] - -Вам попал в руки код объекта `User`, который хранит имя и фамилию в свойстве `this.fullName`: - -```js -function User(fullName) { - this.fullName = fullName; -} - -var vasya = new User("Василий Попкин"); -``` - -Имя и фамилия всегда разделяются пробелом. - -Сделайте, чтобы были доступны свойства `firstName` и `lastName`, причём не только на чтение, но и на запись, вот так: - -```js -var vasya = new User("Василий Попкин"); - -// чтение firstName/lastName -alert( vasya.firstName ); // Василий -alert( vasya.lastName ); // Попкин - -// запись в lastName -vasya.lastName = 'Сидоров'; - -alert( vasya.fullName ); // Василий Сидоров -``` - -Важно: в этой задаче `fullName` должно остаться свойством, а `firstName/lastName` -- реализованы через `get/set`. Лишнее дублирование здесь ни к чему. \ No newline at end of file diff --git a/1-js/6-objects-more/4-descriptors-getters-setters/article.md b/1-js/6-objects-more/4-descriptors-getters-setters/article.md deleted file mode 100644 index 551b1f1e..00000000 --- a/1-js/6-objects-more/4-descriptors-getters-setters/article.md +++ /dev/null @@ -1,403 +0,0 @@ -# Дескрипторы, геттеры и сеттеры свойств - -В этой главе мы рассмотрим возможности, которые позволяют очень гибко и мощно управлять всеми свойствами объекта, включая их аспекты -- изменяемость, видимость в цикле `for..in` и даже незаметно делать их функциями. - -Они поддерживаются всеми современными браузерами, но не IE8-. Впрочем, даже в IE8 их поддерживает, но только для DOM-объектов (используются при работе со страницей, это сейчас вне нашего рассмотрения). - -[cut] -## Дескрипторы в примерах - -Основной метод для управления свойствами -- [Object.defineProperty](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/defineProperty). - -Он позволяет объявить свойство объекта и, что самое главное, тонко настроить его особые аспекты, которые никак иначе не изменить. - -Синтаксис: - -```js -Object.defineProperty(obj, prop, descriptor) -``` - -Аргументы: -
    -
    `obj`
    -
    Объект, в котором объявляется свойство.
    -
    `prop`
    -
    Имя свойства, которое нужно объявить или модифицировать.
    -
    `descriptor`
    -
    Дескриптор -- объект, который описывает поведение свойства. - -В нём могут быть следующие поля: - -
      -
    • `value` -- значение свойства, по умолчанию `undefined`
    • -
    • `writable` -- значение свойства можно менять, если `true`. По умолчанию `false`.
    • -
    • `configurable` -- если `true`, то свойство можно удалять, а также менять его в дальнейшем при помощи новых вызовов `defineProperty`. По умолчанию `false`.
    • -
    • `enumerable` -- если `true`, то свойство будет участвовать в переборе `for..in`. По умолчанию `false`.
    • -
    • `get` -- функция, которая возвращает значение свойства. По умолчанию `undefined`.
    • -
    • `set` -- функция, которая записывает значение свойства. По умолчанию `undefined`.
    • -
    - -Чтобы избежать конфликта, запрещено одновременно указывать значение `value` и функции `get/set`. Либо значение, либо функции для его чтения-записи, одно из двух. Также запрещено и не имеет смысла указывать `writable` при наличии `get/set`-функций. - -Далее мы подробно разберём эти свойства на примерах. - -## Обычное свойство - -Обычное свойство добавить очень просто. - -Два таких вызова работают одинаково: - -```js -//+ no-beautify -var user = {}; - -// 1. простое присваивание -user.name = "Вася"; - -// 2. указание значения через дескриптор -Object.defineProperty(user, "name", { value: "Вася" }); -``` - -## Свойство-константа - -Для того, чтобы сделать свойство неизменяемым, добавим ему флаги `writable` и `configurable`: - -```js -//+ run -*!* -"use strict"; -*/!* - -var user = {}; - -Object.defineProperty(user, "name", { - value: "Вася", - writable: false, // запретить присвоение "user.name=" - configurable: false // запретить удаление "delete user.name" -}); - -// Теперь попытаемся изменить это свойство. - -// в strict mode присвоение "user.name=" вызовет ошибку -*!* -user.name = "Петя"; -*/!* -``` - -Заметим, что без `use strict` операция записи "молча" не сработает, а при `use strict` дополнительно генерируется ошибка. - -## Свойство, скрытое для for..in - -Встроенный метод `toString`, как и большинство встроенных методов, не участвует в цикле `for..in`. Это удобно, так как обычно такое свойство является "служебным". - -К сожалению, свойство `toString`, объявленное обычным способом, будет видно в цикле `for..in`, например: - -```js -//+ run no-beautify -var user = { - name: "Вася", - toString: function() { return this.name; } -}; - -*!* -for(var key in user) alert(key); // name, toString -*/!* -``` - -Мы бы хотели, чтобы поведение нашего метода `toString` было таким же, как и стандартного. - -`Object.defineProperty` может исключить `toString` из списка итерации, поставив ему флаг `enumerable: false`. По стандарту, у встроенного `toString` этот флаг уже стоит. - -```js -//+ run no-beautify -var user = { - name: "Вася", - toString: function() { return this.name; } -}; - -*!* -// помечаем toString как не подлежащий перебору в for..in -Object.defineProperty(user, "toString", {enumerable: false}); - -for(var key in user) alert(key); // name -*/!* -``` - -Обратим внимание, вызов `defineProperty` не перезаписал свойство, а просто модифицировал настройки у существующего `toString`. - -## Свойство-функция - -Дескриптор позволяет задать свойство, которое на самом деле работает как функция. Для этого в нём нужно указать эту функцию в `get`. - -Например, у объекта `user` есть обычные свойства: имя `firstName` и фамилия `surname`. - -Создадим свойство `fullName`, которое на самом деле является функцией: - -```js -//+ run -var user = { - firstName: "Вася", - surname: "Петров" -} - -Object.defineProperty(user, "fullName", { - *!*get*/!*: function() { - return this.firstName + ' ' + this.surname; - } -}); - -*!* -alert(user.fullName); // Вася Петров -*/!* -``` - -Обратим внимание, снаружи `fullName` -- это обычное свойство `user.fullName`. Но дескриптор указывает, что на самом деле его значение возвращается функцией. - -Также можно указать функцию, которая используется для записи значения, при помощи дескриптора `set`. - -Например, добавим возможность присвоения `user.fullName` к примеру выше: - -```js -//+ run -var user = { - firstName: "Вася", - surname: "Петров" -} - -Object.defineProperty(user, "fullName", { - - get: function() { - return this.firstName + ' ' + this.surname; - }, - -*!* - set: function(value) { - var split = value.split(' '); - this.firstName = split[0]; - this.surname = split[1]; - } -*/!* -}); - -*!* -user.fullName = "Петя Иванов"; -*/!* -alert( user.firstName ); // Петя -alert( user.surname ); // Иванов -``` - -## Указание get/set в литералах - -Если мы создаём объект при помощи синтаксиса `{ ... }`, то задать свойства-функции можно прямо в его определении. - -Для этого используется особый синтаксис: `get свойство` или `set свойство`. - -Например, ниже объявлен геттер-сеттер `fullName`: - -```js -//+ run -var user = { - firstName: "Вася", - surname: "Петров", - -*!* - get fullName() { -*/!* - return this.firstName + ' ' + this.surname; - }, - -*!* - set fullName(value) { -*/!* - var split = value.split(' '); - this.firstName = split[0]; - this.surname = split[1]; - } -}; - -*!* -alert( user.fullName ); // Вася Петров (из геттера) - -user.fullName = "Петя Иванов"; -alert( user.firstName ); // Петя (поставил сеттер) -alert( user.surname ); // Иванов (поставил сеттер) -*/!* -``` - -## Да здравствуют get/set! - -Казалось бы, зачем нам назначать get/set для свойства через всякие хитрые вызовы, когда можно сделать просто функции с самого начала? Например, `getFullName`, `setFullName`... - -Конечно, в ряде случаев свойства выглядят короче, такое решение просто может быть красивым. Но основной бонус -- это гибкость, возможность получить контроль над свойством в любой момент! - -Например, в начале разработки мы используем обычные свойства, например у `User` будет имя `name` и возраст `age`: - -```js -function User(name, age) { - this.name = name; - this.age = age; -} - -var pete = new User("Петя", 25); - -alert( pete.age ); // 25 -``` - -С обычными свойствами в коде меньше букв, они удобны, причины использовать функции пока нет. - -...Но рано или поздно могут произойти изменения. Например, в `User` может стать более целесообразно вместо возраста `age` хранить дату рождения `birthday`: - -```js -function User(name, birthday) { - this.name = name; - this.birthday = birthday; -} - -var pete = new User("Петя", new Date(1987, 6, 1)); -``` - -Что теперь делать со старым кодом, который выводит свойство `age`? - -Можно, конечно, найти все места и поправить их, но это долго, а иногда и невозможно, скажем, если вы взаимодействуете со сторонней библиотекой, код в которой -- чужой и влезать в него нежелательно. - -Добавление `get`-функции `age` позволяет обойти проблему легко и непринуждённо: - -```js -//+ run no-beautify -function User(name, birthday) { - this.name = name; - this.birthday = birthday; - -*!* - // age будет высчитывать возраст по birthday - Object.defineProperty(this, "age", { - get: function() { - var todayYear = new Date().getFullYear(); - return todayYear - this.birthday.getFullYear(); - } - }); -*/!* -} - -var pete = new User("Петя", new Date(1987, 6, 1)); - -alert( pete.birthday ); // и дата рождения доступна -alert( pete.age ); // и возраст -``` - -Заметим, что `pete.age` снаружи как было свойством, так и осталось. То есть, переписывать внешний код на вызов функции `pete.age()` не нужно. - -Таким образом, `defineProperty` позволяет нам начать с обычных свойств, а в будущем, при необходимости, можно в любой момент заменить их на функции, реализующие более сложную логику. - -## Другие методы работы со свойствами - -
    -
    [Object.defineProperties(obj, descriptors)](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/defineProperties)
    -
    Позволяет объявить несколько свойств сразу: - -```js -//+ run -var user = {} - -Object.defineProperties(user, { -*!* - firstName: { -*/!* - value: "Петя" - }, - -*!* - surname: { -*/!* - value: "Иванов" - }, - -*!* - fullName: { -*/!* - get: function() { - return this.firstName + ' ' + this.surname; - } - } -}); - -alert( user.fullName ); // Петя Иванов -``` - -
    -
    [Object.keys(obj)](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/keys), [Object.getOwnPropertyNames(obj)](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/getOwnPropertyNames)
    -
    Возвращают массив -- список свойств объекта. - -`Object.keys` возвращает только `enumerable`-свойства. - -`Object.getOwnPropertyNames` -- возвращает все: - -```js -//+ run -var obj = { - a: 1, - b: 2, - internal: 3 -}; - -Object.defineProperty(obj, "internal", { - enumerable: false -}); - -*!* -alert( Object.keys(obj) ); // a,b -alert( Object.getOwnPropertyNames(obj) ); // a, internal, b -*/!* -``` - -
    -
    [Object.getOwnPropertyDescriptor(obj, prop)](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/getOwnPropertyDescriptor)
    -
    Возвращает дескриптор для свойства `obj[prop]`. - -Полученный дескриптор можно изменить и использовать `defineProperty` для сохранения изменений, например: - -```js -//+ run -var obj = { - test: 5 -}; -*!* -var descriptor = Object.getOwnPropertyDescriptor(obj, 'test'); -*/!* - -*!* -// заменим value на геттер, для этого... -*/!* -delete descriptor.value; // ..нужно убрать value/writable -delete descriptor.writable; -descriptor.get = function() { // и поставить get - alert( "Preved :)" ); -}; - -*!* -// поставим новое свойство вместо старого -*/!* - -// если не удалить - defineProperty объединит старый дескриптор с новым -delete obj.test; - -Object.defineProperty(obj, 'test', descriptor); - -obj.test; // Preved :) -``` - -
    -
    - -...И несколько методов, которые используются очень редко: -
    -
    [Object.preventExtensions(obj)](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Object/preventExtensions)
    -
    Запрещает добавление свойств в объект.
    -
    [Object.seal(obj)](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/seal)
    -
    Запрещает добавление и удаление свойств, все текущие свойства делает `configurable: false`.
    -
    [Object.freeze(obj)](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/freeze)
    -
    Запрещает добавление, удаление и изменение свойств, все текущие свойства делает `configurable: false, writable: false`.
    -
    [Object.isExtensible(obj)](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/isExtensible), [Object.isSealed(obj)](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/isSealed), [Object.isFrozen(obj)](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/isFrozen)
    -
    Возвращают `true`, если на объекте были вызваны методы `Object.preventExtensions/seal/freeze`.
    -
    - diff --git a/1-js/6-objects-more/5-static-properties-and-methods/1-objects-counter/_js.view/solution.js b/1-js/6-objects-more/5-static-properties-and-methods/1-objects-counter/_js.view/solution.js deleted file mode 100644 index 03b48506..00000000 --- a/1-js/6-objects-more/5-static-properties-and-methods/1-objects-counter/_js.view/solution.js +++ /dev/null @@ -1,11 +0,0 @@ -function Article() { - this.created = new Date; - - Article.count++; // увеличиваем счетчик при каждом вызове - Article.last = this.created; // и запоминаем дату -} -Article.count = 0; // начальное значение - -Article.showStats = function() { - alert('Всего: ' + this.count + ', Последняя: ' + this.last); -}; \ No newline at end of file diff --git a/1-js/6-objects-more/5-static-properties-and-methods/1-objects-counter/_js.view/test.js b/1-js/6-objects-more/5-static-properties-and-methods/1-objects-counter/_js.view/test.js deleted file mode 100644 index 7bf37039..00000000 --- a/1-js/6-objects-more/5-static-properties-and-methods/1-objects-counter/_js.view/test.js +++ /dev/null @@ -1,28 +0,0 @@ -describe("Article.showStats", function() { - before(function() { - sinon.stub(window, "alert"); - this.clock = sinon.useFakeTimers(); - }); - - after(function() { - window.alert.restore(); - this.clock.restore(); - }); - - it("Выводит число статей и дату создания последней", function() { - new Article(); - this.clock.tick(100); - new Article(); - Article.showStats(); - - assert(alert.calledWith('Всего: 2, Последняя: ' + new Date())); - }); - - it("и ещё одна статья...", function() { - this.clock.tick(100); - new Article(); - Article.showStats(); - - assert(alert.calledWith('Всего: 3, Последняя: ' + new Date())); - }); -}); \ No newline at end of file diff --git a/1-js/6-objects-more/5-static-properties-and-methods/1-objects-counter/solution.md b/1-js/6-objects-more/5-static-properties-and-methods/1-objects-counter/solution.md deleted file mode 100644 index 45ce7d39..00000000 --- a/1-js/6-objects-more/5-static-properties-and-methods/1-objects-counter/solution.md +++ /dev/null @@ -1,29 +0,0 @@ -Решение (как вариант): - -```js -//+ run -function Article() { - this.created = new Date; - -*!* - Article.count++; // увеличиваем счетчик при каждом вызове - Article.last = this.created; // и запоминаем дату -*/!* -} -Article.count = 0; // начальное значение -// (нельзя оставить undefined, т.к. Article.count++ будет NaN) - -Article.showStats = function() { - alert( 'Всего: ' + this.count + ', Последняя: ' + this.last ); -}; - -new Article(); -new Article(); - -Article.showStats(); // Всего: 2, Последняя: (дата) - -new Article(); - -Article.showStats(); // Всего: 3, Последняя: (дата) -``` - diff --git a/1-js/6-objects-more/5-static-properties-and-methods/1-objects-counter/task.md b/1-js/6-objects-more/5-static-properties-and-methods/1-objects-counter/task.md deleted file mode 100644 index 513ed072..00000000 --- a/1-js/6-objects-more/5-static-properties-and-methods/1-objects-counter/task.md +++ /dev/null @@ -1,33 +0,0 @@ -# Счетчик объектов - -[importance 5] - -Добавить в конструктор `Article`: -
      -
    • Подсчёт общего количества созданных объектов.
    • -
    • Запоминание даты последнего созданного объекта.
    • -
    -Используйте для этого статические свойства. - -Пусть вызов `Article.showStats()` выводит то и другое. - -Использование: - -```js -function Article() { - this.created = new Date(); -*!* - // ... ваш код ... -*/!* -} - -new Article(); -new Article(); - -Article.showStats(); // Всего: 2, Последняя: (дата) - -new Article(); - -Article.showStats(); // Всего: 3, Последняя: (дата) -``` - diff --git a/1-js/6-objects-more/5-static-properties-and-methods/article.md b/1-js/6-objects-more/5-static-properties-and-methods/article.md deleted file mode 100644 index 3595a734..00000000 --- a/1-js/6-objects-more/5-static-properties-and-methods/article.md +++ /dev/null @@ -1,255 +0,0 @@ -# Статические и фабричные методы - -Методы и свойства, которые не привязаны к конкретному экземпляру объекта, называют "статическими". Их записывают прямо в саму функцию-конструктор. - -[cut] - -## Статические свойства - -В коде ниже используются статические свойства `Article.count` и `Article.DEFAULT_FORMAT`: - -```js -function Article() { - Article.count++; -} - -Article.count = 0; // статическое свойство-переменная -Article.DEFAULT_FORMAT = "html"; // статическое свойство-константа -``` - -Они хранят данные, специфичные не для одного объекта, а для всех статей целиком. - -Как правило, это чаще константы, такие как формат "по умолчанию" `Article.DEFAULT_FORMAT`. - -## Статические методы - -С примерами статических методов мы уже знакомы: это встроенные методы [String.fromCharCode](http://javascript.ru/String.fromCharCode), [Date.parse](http://javascript.ru/Date.parse). - -Создадим для `Article` статический метод `Article.showCount()`: - -```js -//+ run -function Article() { - Article.count++; - - //... -} -Article.count = 0; - -Article.showCount = function() { -*!* - alert( this.count ); // (1) -*/!* -} - -// использование -new Article(); -new Article(); -Article.showCount(); // (2) -``` - -Здесь `Article.count` -- статическое свойство, а `Article.showCount` -- статический метод. - -Обратим внимание на использование `this` в примере выше. Несмотря на то, что переменная и метод -- статические, он всё ещё полезен. В строке `(1)` он равен `Article`. - -## Пример: сравнение объектов - -Ещё один хороший способ применения -- сравнение объектов. - -Например, у нас есть объект `Journal` для журналов. Журналы можно сравнивать -- по толщине, по весу, по другим параметрам. - -Объявим "стандартную" функцию сравнения, которая будет сравнивать по дате издания. Эта функция сравнения, естественно, не привязана к конкретному журналу, но относится к журналам вообще. - -Поэтому зададим её как статический метод `Journal.compare`: - -```js -function Journal(date) { - this.date = date; - // ... -} - -// возвращает значение, большее 0, если A больше B, иначе меньшее 0 -Journal.compare = function(journalA, journalB) { - return journalA.date - journalB.date; -}; -``` - -В примере ниже эта функция используется для поиска самого раннего журнала из массива: - -```js -//+ run -function Journal(date) { - this.date = date; - - this.formatDate = function(date) { - return date.getDate() + '.' + (date.getMonth() + 1) + '.' + date.getFullYear(); - }; - - this.getTitle = function() { - return "Выпуск от " + this.formatDate(this.date); - }; - -} - -*!* -Journal.compare = function(journalA, journalB) { - return journalA.date - journalB.date; -}; -*/!* - -// использование: -var journals = [ - new Journal(new Date(2012, 1, 1)), - new Journal(new Date(2012, 0, 1)), - new Journal(new Date(2011, 11, 1)) -]; - -function findMin(journals) { - var min = 0; - for (var i = 0; i < journals.length; i++) { -*!* - // используем статический метод - if (Journal.compare(journals[min], journals[i]) > 0) min = i; -*/!* - } - return journals[min]; -} - -alert( findMin(journals).getTitle() ); -``` - -**Статический метод также можно использовать для функций, которые вообще не требуют наличия объекта.** - -Например, метод `formatDate(date)` можно сделать статическим. Он будет форматировать дату "как это принято в журналах", при этом его можно использовать в любом месте кода, не обязательно создавать журнал. - -Например: - -```js -//+ run -function Journal() { /*...*/ } - -Journal.formatDate = function(date) { - return date.getDate() + '.' + (date.getMonth()+1) + '.' + date.getFullYear(); -} - -// ни одного объекта Journal нет, просто форматируем дату -alert( *!*Journal.formatDate(new Date)*/!* ); -``` - -## Фабричные методы - -Рассмотрим ситуацию, когда объект нужно создавать различными способами. Например, это реализовано во встроенном объекте [Date](/datetime). Он по-разному обрабатывает аргументы разных типов: - -
      -
    • `new Date()` -- создаёт объект с текущей датой,
    • -
    • `new Date(milliseconds)` -- создаёт дату по количеству миллисекунд `milliseconds`,
    • -
    • `new Date(year, month, day ...)` -- создаёт дату по компонентам год, месяц, день...
    • -
    • `new Date(datestring)` -- читает дату из строки `datestring`
    • -
    - -**"Фабричный статический метод" -- удобная альтернатива такому конструктору. Так называется статический метод, который служит для создания новых объектов (поэтому и называется "фабричным").** - -Пример встроенного фабричного метода -- [String.fromCharCode(code)](http://javascript.ru/String.fromCharCode). Этот метод создает строку из кода символа: - -```js -//+ run -var str = String.fromCharCode(65); -alert( str ); // 'A' -``` - -Но строки -- слишком простой пример, посмотрим что-нибудь посложнее. - -Допустим, нам нужно создавать объекты `User`: анонимные `new User()` и с данными `new User({name: 'Вася', age: 25})`. - -Можно, конечно, создать полиморфную функцию-конструктор `User`: - -```js -//+ run -function User(userData) { - if (userData) { // если указаны данные -- одна ветка if - this.name = userData.name; - this.age = userData.age; - } else { // если не указаны -- другая - this.name = 'Аноним'; - } - - this.sayHi = function() { - alert(this.name) - }; - // ... -} - -// Использование - -var guest = new User(); -guest.sayHi(); // Аноним - -var knownUser = new User({ - name: 'Вася', - age: 25 -}); -knownUser.sayHi(); // Вася -``` - -Подход с использованием фабричных методов был бы другим. Вместо разбора параметров в конструкторе -- делаем два метода: `User.createAnonymous` и `User.createFromData`. - -Код: - -```js -//+ run -function User() { - this.sayHi = function() { - alert(this.name) - }; -} - -User.createAnonymous = function() { - var user = new User; - user.name = 'Аноним'; - return user; -} - -User.createFromData = function(userData) { - var user = new User; - user.name = userData.name; - user.age = userData.age; - return user; -} - -// Использование - -*!* -var guest = User.createAnonymous(); -guest.sayHi(); // Аноним - -var knownUser = User.createFromData({ - name: 'Вася', - age: 25 -}); -knownUser.sayHi(); // Вася -*/!* -``` - -Преимущества использования фабричных методов: - -[compare] -+Лучшая читаемость кода. Как конструктора -- вместо одной большой функции несколько маленьких, так и вызывающего кода -- явно видно, что именно создаётся. -+Лучший контроль ошибок, т.к. если в `createFromData` ничего не передали, то будет ошибка, а полиморфный конструктор создал бы анонимного посетителя. -+Удобная расширяемость. Например, нужно добавить создание администратора, без аргументов. Фабричный метод сделать легко: `User.createAdmin = function() { ... }`. А для полиморфного конструктора вызов без аргумента создаст анонима, так что нужно добавить параметр -- "тип посетителя" и усложнить этим код. -[/compare] - -**Поэтому полиморфные конструкторы лучше использовать там, где нужна именно полиморфность**, т.е. когда непонятно, какого типа аргумент передадут, и хочется в одном конструкторе охватить все варианты. - -А в остальных случаях отличная альтернатива -- фабричные методы. - -## Итого - -Статические свойства и методы объекта удобно применять в следующих случаях: - -
      -
    • Общие действия и подсчёты, имеющие отношения ко всем объектам данного типа. В примерах выше это подсчёт количества.
    • -
    • Методы, не привязанные к конкретному объекту, например сравнение.
    • -
    • Вспомогательные методы, которые полезны вне объекта, например для форматирования даты.
    • -
    • Фабричные методы.
    • -
    - diff --git a/1-js/6-objects-more/6-call-apply/1-rewrite-sum-arguments/solution.md b/1-js/6-objects-more/6-call-apply/1-rewrite-sum-arguments/solution.md deleted file mode 100644 index 9e5ca007..00000000 --- a/1-js/6-objects-more/6-call-apply/1-rewrite-sum-arguments/solution.md +++ /dev/null @@ -1,31 +0,0 @@ -# Первый вариант - -```js -//+ run -function sumArgs() { - // скопируем reduce из массива - arguments.reduce = [].reduce; - return arguments.reduce(function(a, b) { - return a + b; - }); -} - -alert( sumArgs(4, 5, 6) ); // 15 -``` - -# Второй вариант - -Метод `call` здесь вполне подойдёт, так как требуется вызвать `reduce` в контексте `arguments` с одним аргументом. - -```js -//+ run -function sumArgs() { - // запустим reduce из массива напрямую - return [].reduce.call(arguments, function(a, b) { - return a + b; - }); -} - -alert( sumArgs(4, 5, 6) ); // 15 -``` - diff --git a/1-js/6-objects-more/6-call-apply/1-rewrite-sum-arguments/task.md b/1-js/6-objects-more/6-call-apply/1-rewrite-sum-arguments/task.md deleted file mode 100644 index b03a9fc7..00000000 --- a/1-js/6-objects-more/6-call-apply/1-rewrite-sum-arguments/task.md +++ /dev/null @@ -1,30 +0,0 @@ -# Перепишите суммирование аргументов - -[importance 5] - -Есть функция `sum`, которая суммирует все элементы массива: - -```js -//+ run -function sum(arr) { - return arr.reduce(function(a, b) { - return a + b; - }); -} - -alert( sum([1, 2, 3]) ); // 6 (=1+2+3) -``` - -Создайте аналогичную функцию `sumArgs()`, которая будет суммировать все свои аргументы: - -```js -function sumArgs() { - /* ваш код */ -} - -alert( sumArgs(1, 2, 3) ); // 6, аргументы переданы через запятую, без массива -``` - -Для решения примените метод `reduce` к `arguments`, используя `call`, `apply` или одалживание метода. - -P.S. Функция `sum` вам не понадобится, она приведена в качестве примера использования `reduce` для похожей задачи. \ No newline at end of file diff --git a/1-js/6-objects-more/6-call-apply/2-apply-function-skip-first-argument/_js.view/solution.js b/1-js/6-objects-more/6-call-apply/2-apply-function-skip-first-argument/_js.view/solution.js deleted file mode 100644 index b49aeb62..00000000 --- a/1-js/6-objects-more/6-call-apply/2-apply-function-skip-first-argument/_js.view/solution.js +++ /dev/null @@ -1,3 +0,0 @@ -function applyAll(func) { - return func.apply(this, [].slice.call(arguments, 1)); -} \ No newline at end of file diff --git a/1-js/6-objects-more/6-call-apply/2-apply-function-skip-first-argument/_js.view/test.js b/1-js/6-objects-more/6-call-apply/2-apply-function-skip-first-argument/_js.view/test.js deleted file mode 100644 index 871a19a7..00000000 --- a/1-js/6-objects-more/6-call-apply/2-apply-function-skip-first-argument/_js.view/test.js +++ /dev/null @@ -1,15 +0,0 @@ -describe("applyAll", function() { - - it("применяет функцию ко всем аргументам, начиная со 2го", function() { - var min = applyAll(Math.min, 1, 2, 3); - assert.equal(min, 1); - }); - - it("при отсутствии аргументов просто вызывает функцию", function() { - var spy = sinon.spy(); - applyAll(spy); - assert(spy.calledOnce); - assert.equal(spy.firstCall.args.length, 0); - }); - -}); \ No newline at end of file diff --git a/1-js/6-objects-more/6-call-apply/2-apply-function-skip-first-argument/solution.md b/1-js/6-objects-more/6-call-apply/2-apply-function-skip-first-argument/solution.md deleted file mode 100644 index c8579b0a..00000000 --- a/1-js/6-objects-more/6-call-apply/2-apply-function-skip-first-argument/solution.md +++ /dev/null @@ -1,28 +0,0 @@ - - -```js -//+ run -function sum() { - return [].reduce.call(arguments, function(a, b) { - return a + b; - }); -} - -function mul() { - return [].reduce.call(arguments, function(a, b) { - return a * b; - }); -} - -*!* -function applyAll(func) { - return func.apply(this, [].slice.call(arguments, 1)); - } -*/!* - -alert( applyAll(sum, 1, 2, 3) ); // 6 -alert( applyAll(mul, 2, 3, 4) ); // 24 -alert( applyAll(Math.max, 2, -2, 3) ); // 3 -alert( applyAll(Math.min, 2, -2, 3) ); // -2 -``` - diff --git a/1-js/6-objects-more/6-call-apply/2-apply-function-skip-first-argument/task.md b/1-js/6-objects-more/6-call-apply/2-apply-function-skip-first-argument/task.md deleted file mode 100644 index 95bd2413..00000000 --- a/1-js/6-objects-more/6-call-apply/2-apply-function-skip-first-argument/task.md +++ /dev/null @@ -1,40 +0,0 @@ -# Примените функцию к аргументам - -[importance 5] - -Напишите функцию `applyAll(func, arg1, arg2...)`, которая получает функцию `func` и произвольное количество аргументов. - -Она должна вызвать `func(arg1, arg2...)`, то есть передать в `func` все аргументы, начиная со второго, и возвратить результат. - -Например: - -```js -// Применить Math.max к аргументам 2, -2, 3 -alert( applyAll(Math.max, 2, -2, 3) ); // 3 - -// Применить Math.min к аргументам 2, -2, 3 -alert( applyAll(Math.min, 2, -2, 3) ); // -2 -``` - -Область применения `applyAll`, конечно, шире, можно вызывать её и со своими функциями: - -```js -//+ run -function sum() { // суммирует аргументы: sum(1,2,3) = 6 - return [].reduce.call(arguments, function(a, b) { - return a + b; - }); -} - -function mul() { // перемножает аргументы: mul(2,3,4) = 24 - return [].reduce.call(arguments, function(a, b) { - return a * b; - }); -} - -*!* -alert( applyAll(sum, 1, 2, 3) ); // -> sum(1, 2, 3) = 6 -alert( applyAll(mul, 2, 3, 4) ); // -> mul(2, 3, 4) = 24 -*/!* -``` - diff --git a/1-js/6-objects-more/6-call-apply/article.md b/1-js/6-objects-more/6-call-apply/article.md deleted file mode 100644 index 08f9f386..00000000 --- a/1-js/6-objects-more/6-call-apply/article.md +++ /dev/null @@ -1,311 +0,0 @@ -# Явное указание this: "call", "apply" - -Итак, мы знаем, что `this` -- это текущий объект при вызове "через точку" и новый объект при конструировании через `new`. - -В этой главе наша цель получить окончательное и полное понимание `this` в JavaScript. Для этого не хватает всего одного элемента: способа явно указать `this` при помощи методов `call` и `apply`. - -[cut] - -## Метод call - -Синтаксис метода `call`: - -```js -func.call(context, arg1, arg2, ...) -``` - -При этом вызывается функция `func`, первый аргумент `call` становится её `this`, а остальные передаются "как есть". - -**Вызов `func.call(context, a, b...)` -- то же, что обычный вызов `func(a, b...)`, но с явно указанным `this(=context)`.** - -Например, у нас есть функция `showFullName`, которая работает с `this`: - -```js -function showFullName() { - alert( this.firstName + " " + this.lastName ); -} -``` - -Пока объекта нет, но это нормально, ведь JavaScript позволяет использовать `this` везде. Любая функция может в своём коде упомянуть `this`, каким будет это значение -- выяснится в момент запуска. - -Вызов `showFullName.call(user)` запустит функцию, установив `this = user`, вот так: - -```js -//+ run -function showFullName() { - alert( this.firstName + " " + this.lastName ); -} - -var user = { - firstName: "Василий", - lastName: "Петров" -}; - -*!* -// функция вызовется с this=user -showFullName.call(user) // "Василий Петров" -*/!* -``` - -После контекста в `call` можно передать аргументы для функции. Вот пример с более сложным вариантом `showFullName`, который конструирует ответ из указанных свойств объекта: - -```js -//+ run -var user = { - firstName: "Василий", - surname: "Петров", - patronym: "Иванович" -}; - -function showFullName(firstPart, lastPart) { - alert( this[firstPart] + " " + this[lastPart] ); -} - -*!* -// f.call(контекст, аргумент1, аргумент2, ...) -showFullName.call(user, 'firstName', 'surname') // "Василий Петров" -showFullName.call(user, 'firstName', 'patronym') // "Василий Иванович" -*/!* -``` - -## "Одалживание метода" - -При помощи `call` можно легко взять метод одного объекта, в том числе встроенного, и вызвать в контексте другого. - -Это называется "одалживание метода" (на англ. *method borrowing*). - -**Используем эту технику для упрощения манипуляций с `arguments`.** - -Как мы знаем, `arguments` не массив, а обычный объект, поэтому таких полезных методов как `push`, `pop`, `join` и других у него нет. Но иногда так хочется, чтобы были... - -Нет ничего проще! Давайте скопируем метод `join` из обычного массива: - -```js -//+ run -function printArgs() { - arguments.join = [].join; // одолжили метод (1) - - var argStr = arguments.join(':'); // (2) - - alert( argStr ); // сработает и выведет 1:2:3 -} - -printArgs(1, 2, 3); -``` - -
      -
    1. В строке `(1)` объявлен пустой массив `[]` и скопирован его метод `[].join`. Обратим внимание, мы не вызываем его, а просто копируем. Функция, в том числе встроенная -- обычное значение, мы можем скопировать любое свойство любого объекта, и `[].join` здесь не исключение.
    2. -
    3. В строке `(2)` запустили `join` в контексте `arguments`, как будто он всегда там был.
    4. - -[smart header="Почему вызов сработает?"] - -Здесь метод join массива скопирован и вызван в контексте `arguments`. Не произойдёт ли что-то плохое от того, что `arguments` -- не массив? Почему он, вообще, сработал? - -Ответ на эти вопросы простой. В соответствии [со спецификацией](http://es5.github.com/x15.4.html#x15.4.4.5), внутри `join` реализован примерно так: - -```js -function join(separator) { - if (!this.length) return ''; - - var str = this[0]; - - for (var i = 1; i < this.length; i++) { - str += separator + this[i]; - } - - return str; -} -``` - -Как видно, используется `this`, числовые индексы и свойство `length`. Если эти свойства есть, то все в порядке. А больше ничего и не нужно. - -В качестве `this` подойдёт даже обычный объект: - -```js -//+ run -var obj = { // обычный объект с числовыми индексами и length - 0: "А", - 1: "Б", - 2: "В", - length: 3 -}; - -*!* -obj.join = [].join; -alert( obj.join(';') ); // "A;Б;В" -*/!* -``` - -[/smart] - -...Однако, копирование метода из одного объекта в другой не всегда приемлемо! - -Представим на минуту, что вместо `arguments` у нас -- произвольный объект. У него тоже есть числовые индексы, `length` и мы хотим вызвать в его контексте метод `[].join`. То есть, ситуация похожа на `arguments`, но (!) вполне возможно, что у объекта есть *свой* метод `join`. - -Поэтому копировать `[].join`, как сделано выше, нельзя: если он перезапишет собственный `join` объекта, то будет страшный бардак и путаница. - -Безопасно вызвать метод нам поможет `call`: - -```js -//+ run -function printArgs() { - var join = [].join; // скопируем ссылку на функцию в переменную - -*!* - // вызовем join с this=arguments, - // этот вызов эквивалентен arguments.join(':') из примера выше - var argStr = join.call(arguments, ':'); -*/!* - - alert( argStr ); // сработает и выведет 1:2:3 -} - -printArgs(1, 2, 3); -``` - -Мы вызвали метод без копирования. Чисто, безопасно. - -## Ещё пример: [].slice.call(arguments) - -В JavaScript есть очень простой способ сделать из `arguments` настоящий массив. Для этого возьмём метод массива: slice. - -По стандарту вызов `arr.slice(start, end)` создаёт новый массив и копирует в него элементы массива `arr` от `start` до `end`. А если `start` и `end` не указаны, то копирует весь массив. - -Вызовем его в контексте `arguments`: - -```js -//+ run -function printArgs() { - // вызов arr.slice() скопирует все элементы из this в новый массив -*!* - var args = [].slice.call(arguments); -*/!* - alert( args.join(', ') ); // args - полноценный массив из аргументов -} - -printArgs('Привет', 'мой', 'мир'); // Привет, мой, мир -``` - -Как и в случае с `join`, такой вызов технически возможен потому, что `slice` для работы требует только нумерованные свойства и `length`. Всё это в `arguments` есть. - -## Метод apply - -Если нам неизвестно, с каким количеством аргументов понадобится вызвать функцию, можно использовать более мощный метод: `apply`. - -**Вызов функции при помощи `func.apply` работает аналогично `func.call`, но принимает массив аргументов вместо списка.** - -```js -func.call(context, arg1, arg2); -// идентичен вызову -func.apply(context, [arg1, arg2]); -``` - -В частности, эти две строчки cработают одинаково: - -```js -showFullName.call(user, 'firstName', 'surname'); - -showFullName.apply(user, ['firstName', 'surname']); -``` - -Преимущество `apply` перед `call` отчётливо видно, когда мы формируем массив аргументов динамически. - -Например, в JavaScript есть встроенная функция `Math.max(a, b, c...)`, которая возвращает максимальное значение из аргументов: - -```js -//+ run -alert( Math.max(1, 5, 2) ); // 5 -``` - -При помощи `apply` мы могли бы найти максимум в произвольном массиве, вот так: - -```js -//+ run -var arr = []; -arr.push(1); -arr.push(5); -arr.push(2); - -// получить максимум из элементов arr -alert( Math.max.apply(null, arr) ); // 5 -``` - -В примере выше мы передали аргументы через массив -- второй параметр `apply`... Но вы, наверное, заметили небольшую странность? В качестве контекста `this` был передан `null`. - -Строго говоря, полным эквивалентом вызову `Math.max(1,2,3)` был бы вызов `Math.max.apply(Math, [1,2,3])`. В обоих этих вызовах контекстом будет объект `Math`. - -Но в данном случае в качестве контекста можно передавать что угодно, поскольку в своей внутренней реализации метод `Math.max` не использует `this`. Действительно, зачем `this`, если нужно всего лишь выбрать максимальный из аргументов? Вот так, при помощи `apply` мы получили короткий и элегантный способ вычислить максимальное значение в массиве! - -[smart header="Вызов `call/apply` с `null` или `undefined`"] - -В современном стандарте `call/apply` передают `this` "как есть". А в старом, без `use strict`, при указании первого аргумента `null` или `undefined` в `call/apply`, функция получает `this = window`, например: - -Современный стандарт: -```js -//+ run -function f() { - "use strict"; -*!* - alert( this ); // null -*/!* -} - -f.call(null); -``` - -Без `use strict`: - -```js -//+ run -function f() { - alert( this ); // window -} - -f.call(null); -``` - -[/smart] - -## Итого про this - -Значение `this` устанавливается в зависимости от того, как вызвана функция: - -
      -
      При вызове функции как метода
      -
      - -```js -//+ no-beautify -obj.func(...) // this = obj -obj["func"](...) -``` - -
      -
      При обычном вызове
      -
      - -```js -func(...) // this = window (ES3) /undefined (ES5) -``` - -
      -
      В `new`
      -
      - -```js -new func() // this = {} (новый объект) -``` - -
      -
      Явное указание
      -
      - -```js -func.apply(context, args) // this = context (явная передача) -func.call(context, arg1, arg2, ...) -``` - -
      -
      - - diff --git a/1-js/6-objects-more/7-bind/1-cross-browser-bind/solution.md b/1-js/6-objects-more/7-bind/1-cross-browser-bind/solution.md deleted file mode 100644 index 28b52dcb..00000000 --- a/1-js/6-objects-more/7-bind/1-cross-browser-bind/solution.md +++ /dev/null @@ -1,8 +0,0 @@ - -Страшновато выглядит, да? Работает так (по строкам): -
        -
      1. Вызов `bind` сохраняет дополнительные аргументы `args` (они идут со 2го номера) в массив `bindArgs`.
      2. -
      3. ... и возвращает обертку `wrapper`.
      4. -
      5. Эта обёртка делает из `arguments` массив `args` и затем, используя метод [concat](http://javascript.ru/Array/concat), прибавляет их к аргументам `bindArgs` (карринг).
      6. -
      7. Затем передаёт вызов `func` с контекстом и общим массивом аргументов.
      8. -
      diff --git a/1-js/6-objects-more/7-bind/1-cross-browser-bind/task.md b/1-js/6-objects-more/7-bind/1-cross-browser-bind/task.md deleted file mode 100644 index ce481712..00000000 --- a/1-js/6-objects-more/7-bind/1-cross-browser-bind/task.md +++ /dev/null @@ -1,23 +0,0 @@ -# Кросс-браузерная эмуляция bind - -[importance 3] - -Если вы вдруг захотите копнуть поглубже -- аналог `bind` для IE8- и старых версий других браузеров будет выглядеть следующим образом: - -```js -//+ no-beautify -function bind(func, context /*, args*/) { - var bindArgs = [].slice.call(arguments, 2); // (1) - function wrapper() { // (2) - var args = [].slice.call(arguments); - var unshiftArgs = bindArgs.concat(args); // (3) - return func.apply(context, unshiftArgs); // (4) - } - return wrapper; -} -``` - -Использование -- вместо `mul.bind(null, 2)` вызывать `bind(mul, null, 2)`. - -Не факт, что он вам понадобится, но в качестве упражнение попробуйте разобраться, как это работает. - diff --git a/1-js/6-objects-more/7-bind/2-write-to-object-after-bind/solution.md b/1-js/6-objects-more/7-bind/2-write-to-object-after-bind/solution.md deleted file mode 100644 index ccd6ca0c..00000000 --- a/1-js/6-objects-more/7-bind/2-write-to-object-after-bind/solution.md +++ /dev/null @@ -1,22 +0,0 @@ -Ответ: `Hello`. - -```js -//+ run -function f() { - alert( this ); -} - -var user = { - g: f.bind("Hello") -} - -user.g(); -``` - -Так как вызов идёт в контексте объекта `user.g()`, то внутри функции `g` контекст `this = user`. - -Однако, функции `g` совершенно без разницы, какой `this` она получила. - -Её единственное предназначение -- это передать вызов в `f` вместе с аргументами и ранее указанным контекстом `"Hello"`, что она и делает. - -Эта задача демонстрирует, что изменить однажды привязанный контекст уже нельзя. \ No newline at end of file diff --git a/1-js/6-objects-more/7-bind/2-write-to-object-after-bind/task.md b/1-js/6-objects-more/7-bind/2-write-to-object-after-bind/task.md deleted file mode 100644 index a189eeb3..00000000 --- a/1-js/6-objects-more/7-bind/2-write-to-object-after-bind/task.md +++ /dev/null @@ -1,18 +0,0 @@ -# Запись в объект после bind - -[importance 5] - -Что выведет функция? - -```js -function f() { - alert( this ); -} - -var user = { - g: f.bind("Hello") -} - -user.g(); -``` - diff --git a/1-js/6-objects-more/7-bind/3-second-bind/solution.md b/1-js/6-objects-more/7-bind/3-second-bind/solution.md deleted file mode 100644 index 2a8b26d8..00000000 --- a/1-js/6-objects-more/7-bind/3-second-bind/solution.md +++ /dev/null @@ -1,58 +0,0 @@ -Ответ: `"Вася"`. - -```js -//+ run no-beautify -function f() { - alert(this.name); -} - -f = f.bind( {name: "Вася"} ).bind( {name: "Петя"} ); - -f(); // Вася -``` - -Первый вызов `f.bind(..Вася..)` возвращает "обёртку", которая устанавливает контекст для `f` и передаёт вызов `f`. - -Следующий вызов `bind` будет устанавливать контекст уже для этой обёртки. Это ни на что не повлияет. - -Чтобы это проще понять, используем наш собственный вариант `bind` вместо встроенного: - -```js -function bind(func, context) { - return function() { - return func.apply(context, arguments); - }; -} -``` - -Код станет таким: - -```js -//+ no-beautify -function f() { - alert(this.name); -} - -f = bind(f, {name: "Вася"} ); // (1) -f = bind(f, {name: "Петя"} ); // (2) - -f(); // Вася -``` - -Здесь видно, что первый вызов `bind`, в строке `(1)`, возвращает обёртку вокруг `f`, которая выглядит так (выделена): - -```js -function bind(func, context) { -*!* - return function() { - // здесь this не используется - return func.apply(context, arguments); - }; -*/!* -} -``` - -В этой обёртке нигде не используется `this`, контекст `context` берётся из замыкания. Посмотрите на код, там нигде нет `this`. - -Поэтому следующий `bind` в строке `(2)`, который выполняется уже над обёрткой и фиксирует в ней `this`, ни на что не влияет. Какая разница, что будет в качестве `this` в функции, которая этот `this` не использует? Контекст `context`, как видно в коде выше, она получает через замыкание из аргументов первого `bind`. - diff --git a/1-js/6-objects-more/7-bind/3-second-bind/task.md b/1-js/6-objects-more/7-bind/3-second-bind/task.md deleted file mode 100644 index 3b0f06b2..00000000 --- a/1-js/6-objects-more/7-bind/3-second-bind/task.md +++ /dev/null @@ -1,17 +0,0 @@ -# Повторный bind - -[importance 5] - -Что выведет этот код? - -```js -//+ no-beautify -function f() { - alert(this.name); -} - -f = f.bind( {name: "Вася"} ).bind( {name: "Петя" } ); - -f(); -``` - diff --git a/1-js/6-objects-more/7-bind/4-function-property-after-bind/solution.md b/1-js/6-objects-more/7-bind/4-function-property-after-bind/solution.md deleted file mode 100644 index a882a35e..00000000 --- a/1-js/6-objects-more/7-bind/4-function-property-after-bind/solution.md +++ /dev/null @@ -1,4 +0,0 @@ -Ответ: `undefined`. - -Результатом работы `bind` является функция-обёртка над `sayHi`. Эта функция -- самостоятельный объект, у неё уже нет свойства `test`. - diff --git a/1-js/6-objects-more/7-bind/4-function-property-after-bind/task.md b/1-js/6-objects-more/7-bind/4-function-property-after-bind/task.md deleted file mode 100644 index b182b4e5..00000000 --- a/1-js/6-objects-more/7-bind/4-function-property-after-bind/task.md +++ /dev/null @@ -1,22 +0,0 @@ -# Свойство функции после bind - -[importance 5] - -В свойство функции записано значение. Изменится ли оно после применения `bind`? Обоснуйте ответ. - -```js -function sayHi() { - alert( this.name ); -} -sayHi.test = 5; -alert( sayHi.test ); // 5 - -*!* -var bound = sayHi.bind({ - name: "Вася" -}); - -alert( bound.test ); // что выведет? почему? -*/!* -``` - diff --git a/1-js/6-objects-more/7-bind/5-question-use-bind/solution.md b/1-js/6-objects-more/7-bind/5-question-use-bind/solution.md deleted file mode 100644 index 7eb5963e..00000000 --- a/1-js/6-objects-more/7-bind/5-question-use-bind/solution.md +++ /dev/null @@ -1,110 +0,0 @@ -# Решение с bind - -Ошибка происходит потому, что `ask` получает только функцию, без объекта-контекста. - -Используем `bind`, чтобы передать в `ask` функцию с уже привязанным контекстом: - -```js -//+ run -"use strict"; - -function ask(question, answer, ok, fail) { - var result = prompt(question, ''); - if (result.toLowerCase() == answer.toLowerCase()) ok(); - else fail(); -} - -var user = { - login: 'Василий', - password: '12345', - - loginOk: function() { - alert( this.login + ' вошёл в сайт' ); - }, - - loginFail: function() { - alert( this.login + ': ошибка входа' ); - }, - - checkPassword: function() { -*!* - ask("Ваш пароль?", this.password, this.loginOk.bind(this), this.loginFail.bind(this)); -*/!* - } -}; - -var vasya = user; -user = null; -vasya.checkPassword(); -``` - -# Решение через замыкание - -Альтернативное решение -- сделать функции-обёртки над `user.loginOk/loginFail`: - -```js -//+ no-beautify -var user = { - ... - checkPassword: function() { -*!* - ask("Ваш пароль?", this.password, - function() { user.loginOk(); }, function() { user.loginFail(); }); -*/!* - } -} -``` - -...Но такой код использует переменную `user`, так что если объект переместить из неё, к примеру, так, то работать он не будет: - -```js -var vasya = user; // переместим user в vasya -user = null; -vasya.checkPassword(); // упс будет ошибка, ведь в коде объекта остался user -``` - -Для того, чтобы избежать проблем, можно использовать `this`. Внутри `checkPassword` он всегда будет равен текущему объекту, так что скопируем его в переменную, которую назовём `self`: - -```js -//+ run -"use strict"; - -function ask(question, answer, ok, fail) { - var result = prompt(question, ''); - if (result.toLowerCase() == answer.toLowerCase()) ok(); - else fail(); -} - -var user = { - login: 'Василий', - password: '12345', - - loginOk: function() { - alert( this.login + ' вошёл в сайт' ); - }, - - loginFail: function() { - alert( this.login + ': ошибка входа' ); - }, - - checkPassword: function() { -*!* - var self = this; - ask("Ваш пароль?", this.password, - function() { - self.loginOk(); - }, - function() { - self.loginFail(); - } - ); -*/!* - } -}; - -var vasya = user; -user = null; -vasya.checkPassword(); -``` - -Теперь всё работает. Анонимные функции достают правильный контекст из замыкания, где он сохранён в переменной `self`. \ No newline at end of file diff --git a/1-js/6-objects-more/7-bind/5-question-use-bind/task.md b/1-js/6-objects-more/7-bind/5-question-use-bind/task.md deleted file mode 100644 index a36bb858..00000000 --- a/1-js/6-objects-more/7-bind/5-question-use-bind/task.md +++ /dev/null @@ -1,50 +0,0 @@ -# Использование функции вопросов - -[importance 5] - -Вызов `user.checkPassword()` в коде ниже должен, при помощи `ask`, спрашивать пароль и вызывать `loginOk/loginFail` в зависимости от правильности ответа. - -Однако, его вызов приводит к ошибке. Почему? - -Исправьте выделенную строку, чтобы всё работало (других строк изменять не надо). - -```js -//+ run -"use strict"; - -function ask(question, answer, ok, fail) { - var result = prompt(question, ''); - if (result.toLowerCase() == answer.toLowerCase()) ok(); - else fail(); -} - -var user = { - login: 'Василий', - password: '12345', - - loginOk: function() { - alert( this.login + ' вошёл в сайт' ); - }, - - loginFail: function() { - alert( this.login + ': ошибка входа' ); - }, - - checkPassword: function() { -*!* - ask("Ваш пароль?", this.password, this.loginOk, this.loginFail); -*/!* - } -}; - -user.checkPassword(); -``` - -P.S. Ваше решение должно также срабатывать, если переменная `user` будет перезаписана, например вместо `user.checkPassword()` в конце будут строки: - -```js -var vasya = user; -user = null; -vasya.checkPassword(); -``` - diff --git a/1-js/6-objects-more/7-bind/6-ask-currying/solution.md b/1-js/6-objects-more/7-bind/6-ask-currying/solution.md deleted file mode 100644 index 86877551..00000000 --- a/1-js/6-objects-more/7-bind/6-ask-currying/solution.md +++ /dev/null @@ -1,73 +0,0 @@ -# Решение с bind - -Первое решение -- передать в `ask` функции с привязанным контекстом и аргументами. - -```js -//+ run -"use strict"; - -function ask(question, answer, ok, fail) { - var result = prompt(question, ''); - if (result.toLowerCase() == answer.toLowerCase()) ok(); - else fail(); -} - -var user = { - login: 'Василий', - password: '12345', - - loginDone: function(result) { - alert( this.login + (result ? ' вошёл в сайт' : ' ошибка входа') ); - }, - - checkPassword: function() { -*!* - ask("Ваш пароль?", this.password, this.loginDone.bind(this, true), this.loginDone.bind(this, false)); -*/!* - } -}; - -user.checkPassword(); -``` - -# Решение с локальной переменной - -Второе решение -- это скопировать `this` в локальную переменную (чтобы внешняя перезапись не повлияла): - -```js -//+ run -"use strict"; - -function ask(question, answer, ok, fail) { - var result = prompt(question, ''); - if (result.toLowerCase() == answer.toLowerCase()) ok(); - else fail(); -} - -var user = { - login: 'Василий', - password: '12345', - - loginDone: function(result) { - alert( this.login + (result ? ' вошёл в сайт' : ' ошибка входа') ); - }, - - checkPassword: function() { - var self = this; -*!* - ask("Ваш пароль?", this.password, - function() { - self.loginDone(true); - }, - function() { - self.loginDone(false); - } - ); -*/!* - } -}; - -user.checkPassword(); -``` - -Оба решения хороши, вариант с `bind` короче. \ No newline at end of file diff --git a/1-js/6-objects-more/7-bind/6-ask-currying/task.md b/1-js/6-objects-more/7-bind/6-ask-currying/task.md deleted file mode 100644 index 7b48e190..00000000 --- a/1-js/6-objects-more/7-bind/6-ask-currying/task.md +++ /dev/null @@ -1,57 +0,0 @@ -# Использование функции вопросов с каррингом - -[importance 5] - -Эта задача -- усложнённый вариант задачи [](/task/question-use-bind). В ней объект `user` изменён. - -Теперь заменим две функции `user.loginOk()` и `user.loginFail()` на единый метод: `user.loginDone(true/false)`, который нужно вызвать с `true` при верном ответе и `fail` -- при неверном. - -Код ниже делает это, соответствующий фрагмент выделен. - -**Сейчас он обладает важным недостатком: при записи в `user` другого значения объект перестанет корректно работать, вы увидите это, запустив пример ниже (будет ошибка).** - -Как бы вы написали правильно? - -**Исправьте выделенный фрагмент, чтобы код заработал.** - -```js -//+ run -"use strict"; - -function ask(question, answer, ok, fail) { - var result = prompt(question, ''); - if (result.toLowerCase() == answer.toLowerCase()) ok(); - else fail(); -} - -var user = { - login: 'Василий', - password: '12345', - - // метод для вызова из ask - loginDone: function(result) { - alert( this.login + (result ? ' вошёл в сайт' : ' ошибка входа') ); - }, - - checkPassword: function() { -*!* - ask("Ваш пароль?", this.password, - function() { - user.loginDone(true); - }, - function() { - user.loginDone(false); - } - ); -*/!* - } -}; - -var vasya = user; -user = null; -vasya.checkPassword(); -``` - -Изменения должны касаться только выделенного фрагмента. - -Если возможно, предложите два решения, одно -- с использованием `bind`, другое -- без него. Какое решение лучше? diff --git a/1-js/6-objects-more/7-bind/article.md b/1-js/6-objects-more/7-bind/article.md deleted file mode 100644 index a18a910e..00000000 --- a/1-js/6-objects-more/7-bind/article.md +++ /dev/null @@ -1,434 +0,0 @@ -# Привязка контекста и карринг: "bind" - -Функции в JavaScript никак не привязаны к своему контексту `this`, с одной стороны, здорово -- это позволяет быть максимально гибкими, одалживать методы и так далее. - -Но с другой стороны -- в некоторых случаях контекст может быть потерян. То есть мы вроде как вызываем метод объекта, а на самом деле он получает `this = undefined`. - -Такая ситуация является типичной для начинающих разработчиков, но бывает и у "зубров" тоже. Конечно, "зубры" при этом знают, что с ней делать. - -[cut] - -## Пример потери контекста - -В браузере есть встроенная функция `setTimeout(func, ms)`, которая вызывает выполение функции `func` через `ms` миллисекунд (=1/1000 секунды). - -Мы подробно остановимся на ней и её тонкостях позже, в главе [](/settimeout-setinterval), а пока просто посмотрим пример. - -Этот код выведет "Привет" через 1000мс, то есть 1 секунду: - -```js -//+ run -setTimeout(function() { - alert( "Привет" ); -}, 1000); -``` - -Попробуем сделать то же самое с методом объекта, следующий код должен выводить имя пользователя через 1 секунду: - -```js -//+ run -var user = { - firstName: "Вася", - sayHi: function() { - alert( this.firstName ); - } -}; - -*!* -setTimeout(user.sayHi, 1000); // undefined (не Вася!) -*/!* -``` - -При запуске кода выше через секунду выводится вовсе не `"Вася"`, а `undefined`! - -Это произошло потому, что в примере выше `setTimeout` получил функцию `user.sayHi`, но не её контекст. То есть, последняя строчка аналогична двум таким: - -```js -var f = user.sayHi; -setTimeout(f, 1000); // контекст user потеряли -``` - - -Ситуация довольно типична -- мы хотим передать метод объекта куда-то в другое место кода, откуда он потом может быть вызван. Как бы прикрепить к нему контекст, желательно, с минимумом плясок с бубном и при этом надёжно? - -Есть несколько способов решения, среди которых мы, в зависимости от ситуации, можем выбирать. - -## Решение 1: сделать обёртку - -Самый простой вариант решения -- это обернуть вызов в анонимную функцию: - -```js -//+ run -var user = { - firstName: "Вася", - sayHi: function() { - alert( this.firstName ); - } -}; - -*!* -setTimeout(function() { - user.sayHi(); // Вася -}, 1000); -*/!* -``` - -Теперь код работает, так как `user` достаётся из замыкания. - -Это решение также позволяет передать дополнительные аргументы: - - -```js -//+ run -var user = { - firstName: "Вася", - sayHi: function(who) { - alert( this.firstName + ": Привет, " + who ); - } -}; - -*!* -setTimeout(function() { - user.sayHi("Петя"); // Вася: Привет, Петя -}, 1000); -*/!* -``` - - -Но тут же появляется и уязвимое место в структуре кода! - -А что, если до срабатывания `setTimeout` (ведь есть целая секунда) в переменную `user` будет записано другое значение? К примеру, в другом месте кода будет присвоено `user=(другой пользователь)`... В этом случае вызов неожиданно будет совсем не тот! - -Хорошо бы гарантировать правильность контекста. - -## Решение 2: bind для привязки контекста - -Напишем вспомогательную функцию `bind(func, context)`, которая будет жёстко фиксировать контекст для `func`: - -```js -function bind(func, context) { - return function() { // (*) - return func.apply(context, arguments); - }; -} -``` - -Посмотрим, что она делает, как работает, на таком примере: - -```js -//+ run -function f() { - alert( this ); -} - -var g = bind(f, "Context"); -g(); // Context -``` - -То есть, `bind(f, "Context")` привязывает `"Context"` в качестве `this` для `f`. - -Посмотрим, за счёт чего это происходит. - -Результатом `bind(f, "Context")`, как видно из кода, будет анонимная функция `(*)`. - -Вот она отдельно: - -```js -function() { // (*) - return func.apply(context, arguments); -}; -``` - -Если подставить наши конкретные аргументы, то есть `f` и `"Context"`, то получится так: - -```js -function() { // (*) - return f.apply("Context", arguments); -}; -``` - -Эта функция запишется в переменную `g`. - -Далее, если вызвать `g`, то вызов будет передан в `f`, причём `f.apply("Context", arguments)` передаст в качестве контекста `"Context"`, который и будет выведен. - -Если вызвать `g` с аргументами, то также будет работать: - -```js -//+ run -function f(a, b) { - alert( this ); - alert( a + b ); -} - -var g = bind(f, "Context"); -g(1, 2); // Context, затем 3 -``` - -Аргументы, которые получила `g(...)`, передаются в `f` также благодаря методу `.apply`. - -**Иными словами, в результате вызова `bind(func, context)` мы получаем "функцию-обёртку", которая прозрачно передаёт вызов в `func`, с теми же аргументами, но фиксированным контекстом `context`.** - -Вернёмся к `user.sayHi`. Вариант с `bind`: - -```js -//+ run -function bind(func, context) { - return function() { - return func.apply(context, arguments); - }; -} - -var user = { - firstName: "Вася", - sayHi: function() { - alert( this.firstName ); - } -}; - -*!* -setTimeout(bind(user.sayHi, user), 1000); -*/!* -``` - -Теперь всё в порядке! - -Вызов `bind(user.sayHi, user)` возвращает такую функцию-обёртку, которая привязывает `user.sayHi` к контексту `user`. Она будет вызвана через 1000мс. - -Полученную обёртку можно вызвать и с аргументами -- они пойдут в `user.sayHi` без изменений, фиксирован лишь контекст. - -```js -//+ run -var user = { - firstName: "Вася", -*!* - sayHi: function(who) { // здесь у sayHi есть один аргумент -*/!* - alert( this.firstName + ": Привет, " + who ); - } -}; - -var sayHi = bind(user.sayHi, user); - -*!* -// контекст Вася, а аргумент передаётся "как есть" -sayHi("Петя"); // Вася: Привет, Петя -sayHi("Маша"); // Вася: Привет, Маша -*/!* -``` - -В примере выше продемонстрирована другая частая цель использования `bind` -- "привязать" функцию к контексту, чтобы в дальнейшем "не таскать за собой" объект, а просто вызывать `sayHi`. - -Результат `bind` можно передавать в любое место кода, вызывать как обычную функцию, он "помнит" свой контекст. - -## Решение 3: встроенный метод bind [#bind] - -В современном JavaScript (или при подключении библиотеки [es5-shim](https://github.com/kriskowal/es5-shim) для IE8-) у функций уже есть встроенный метод [bind](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/bind), который мы можем использовать. - -Он работает примерно так же, как `bind`, который описан выше. - -Изменения очень небольшие: - -```js -//+ run -function f(a, b) { - alert( this ); - alert( a + b ); -} - -*!* -// вместо -// var g = bind(f, "Context"); -var g = f.bind("Context"); -*/!* -g(1, 2); // Context, затем 3 -``` - -Синтаксис встроенного `bind`: - -```js -var wrapper = func.bind(context[, arg1, arg2...]) -``` - -
      -
      `func`
      -
      Произвольная функция
      -
      `context`
      -
      Контекст, который привязывается к `func`
      -
      `arg1`, `arg2`, ...
      -
      Если указаны аргументы `arg1, arg2...` -- они будут прибавлены к каждому вызову новой функции, причем встанут *перед* теми, которые указаны при вызове.
      -
      - -Результат вызова `func.bind(context)` аналогичен вызову `bind(func, context)`, описанному выше. То есть, `wrapper` -- это обёртка, фиксирующая контекст и передающая вызовы в `func`. Также можно указать аргументы, тогда и они будут фиксированы, но об этом чуть позже. - -Пример со встроенным методом `bind`: - -```js -//+ run -var user = { - firstName: "Вася", - sayHi: function() { - alert( this.firstName ); - } -}; - -*!* -// setTimeout( bind(user.sayHi, user), 1000 ); -setTimeout(user.sayHi.bind(user), 1000); // аналог через встроенный метод -*/!* -``` - -Получили простой и надёжный способ привязать контекст, причём даже встроенный в JavaScript. - -Далее мы будем использовать именно встроенный метод `bind`. - -[warn header="bind не похож на call/apply"] -Методы `bind` и `call/apply` близки по синтаксису, но есть важнейшее отличие. - -Методы `call/apply` вызывают функцию с заданным контекстом и аргументами. - -А `bind` не вызывает функцию. Он только возвращает "обёртку", которую мы можем вызвать позже, и которая передаст вызов в исходную функцию, с привязанным контекстом. -[/warn] - -[smart header="Привязать всё: `bindAll`"] -Если у объекта много методов и мы планируем их активно передавать, то можно привязать контекст для них всех в цикле: - -```js -for (var prop in user) { - if (typeof user[prop] == 'function') { - user[prop] = user[prop].bind(user); - } -} -``` - -В некоторых JS-фреймворках есть даже встроенные функции для этого, например [_.bindAll(obj)](http://lodash.com/docs#bindAll). -[/smart] - - -## Карринг - -До этого мы говорили о привязке контекста. Теперь пойдём на шаг дальше. Привязывать можно не только контекст, но и аргументы. Используется это реже, но бывает полезно. - -[Карринг](http://ru.wikipedia.org/wiki/%D0%9A%D0%B0%D1%80%D1%80%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5) (currying) или *каррирование* -- термин [функционального программирования](http://ru.wikipedia.org/wiki/%D0%A4%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%BE%D0%BD%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5), который означает создание новой функции путём фиксирования аргументов существующей. - -Как было сказано выше, метод `func.bind(context, ...)` может создавать обёртку, которая фиксирует не только контекст, но и ряд аргументов функции. - -Например, есть функция умножения двух чисел `mul(a, b)`: - -```js -function mul(a, b) { - return a * b; -}; -``` - -При помощи `bind` создадим функцию `double`, удваивающую значения. Это будет вариант функции `mul` с фиксированным первым аргументом: - -```js -//+ run -*!* -// double умножает только на два -var double = mul.bind(null, 2); // контекст фиксируем null, он не используется -*/!* - -alert( double(3) ); // = mul(2, 3) = 6 -alert( double(4) ); // = mul(2, 4) = 8 -alert( double(5) ); // = mul(2, 5) = 10 -``` - -При вызове `double` будет передавать свои аргументы исходной функции `mul` после тех, которые указаны в `bind`, то есть в данном случае после зафиксированного первого аргумента `2`. - -**Говорят, что `double` является "частичной функцией" (partial function) от `mul`.** - -Другая частичная функция `triple` утраивает значения: - -```js -//+ run -*!* -var triple = mul.bind(null, 3); // контекст фиксируем null, он не используется -*/!* - -alert( triple(3) ); // = mul(3, 3) = 9 -alert( triple(4) ); // = mul(3, 4) = 12 -alert( triple(5) ); // = mul(3, 5) = 15 -``` - -При помощи `bind` мы можем получить из функции её "частный вариант" как самостоятельную функцию и дальше передать в `setTimeout` или сделать с ней что-то ещё. - -Наш выигрыш состоит в том, что эта самостоятельная функция, во-первых, имеет понятное имя (`double`, `triple`), а во-вторых, повторные вызовы позволяют не указывать каждый раз первый аргумент, он уже фиксирован благодаря `bind`. - -## Функция ask для задач - -В задачах этого раздела предполагается, что объявлена следующая "функция вопросов" `ask`: - -```js -function ask(question, answer, ok, fail) { - var result = prompt(question, ''); - if (result.toLowerCase() == answer.toLowerCase()) ok(); - else fail(); -} -``` - -Её назначение -- задать вопрос `question` и, если ответ совпадёт с `answer`, то запустить функцию `ok()`, а иначе -- функцию `fail()`. - -Несмотря на внешнюю простоту, функции такого вида активно используются в реальных проектах. Конечно, они будут сложнее, вместо `alert/prompt` -- вывод красивого JavaScript-диалога с рамочками, кнопочками и так далее, но это нам сейчас не нужно. - -Пример использования: - -```js -//+ run -*!* -ask("Выпустить птичку?", "да", fly, die); -*/!* - -function fly() { - alert( 'улетела :)' ); -} - -function die() { - alert( 'птичку жалко :(' ); -} -``` - -## Итого - -
        -
      • Функция сама по себе не запоминает контекст выполнения.
      • -
      • Чтобы гарантировать правильный контекст для вызова `obj.func()`, нужно использовать функцию-обёртку, задать её через анонимную функцию: -```js -setTimeout(function() { - obj.func(); -}) -``` -
      • -
      • ...Либо использовать `bind`: - -```js -setTimeout(obj.func.bind(obj)); -``` -
      • -
      • Вызов `bind` часто используют для привязки функции к контексту, чтобы затем присвоить её в обычную переменную и вызывать уже без явного указания объекта.
      • -
      • Вызов `bind` также позволяет фиксировать первые аргументы функции ("каррировать" её), и таким образом из общей функции получить её "частные" варианты -- чтобы использовать их многократно без повтора одних и тех же аргументов каждый раз.
      • -
      - -[head] - -[/head] diff --git a/1-js/6-objects-more/8-decorators/1-logging-decorator/_js.view/solution.js b/1-js/6-objects-more/8-decorators/1-logging-decorator/_js.view/solution.js deleted file mode 100644 index 1aa8f279..00000000 --- a/1-js/6-objects-more/8-decorators/1-logging-decorator/_js.view/solution.js +++ /dev/null @@ -1,9 +0,0 @@ -function makeLogging(f, log) { - - function wrapper(a) { - log.push(a); - return f.call(this, a); - } - - return wrapper; -} \ No newline at end of file diff --git a/1-js/6-objects-more/8-decorators/1-logging-decorator/_js.view/test.js b/1-js/6-objects-more/8-decorators/1-logging-decorator/_js.view/test.js deleted file mode 100644 index 2257ee89..00000000 --- a/1-js/6-objects-more/8-decorators/1-logging-decorator/_js.view/test.js +++ /dev/null @@ -1,50 +0,0 @@ -describe("makeLogging", function() { - it("записывает вызовы в массив log", function() { - var work = sinon.spy(); - - var log = []; - work = makeLogging(work, log); - assert.deepEqual(log, []); - - work(1); - assert.deepEqual(log, [1]); - - work(2); - assert.deepEqual(log, [1, 2]); - }); - - it("передаёт вызов функции, возвращает её результат", function() { - var log = []; - - function work(x) { - return x * 2; - } - - work = sinon.spy(work); - var spy = work; - work = makeLogging(work, log); - - assert.equal(work(1), 2); - assert(spy.calledWith(1)); - }); - - - it("сохраняет контекст вызова для методов объекта", function() { - var log = []; - - var calculator = { - double: function(x) { - return x * 2; - } - } - - calculator.double = sinon.spy(calculator.double); - var spy = calculator.double; - calculator.double = makeLogging(calculator.double, log); - - assert.equal(calculator.double(1), 2); - assert(spy.calledWith(1)); - assert(spy.calledOn(calculator)); - }); - -}); \ No newline at end of file diff --git a/1-js/6-objects-more/8-decorators/1-logging-decorator/solution.md b/1-js/6-objects-more/8-decorators/1-logging-decorator/solution.md deleted file mode 100644 index 103ff4e5..00000000 --- a/1-js/6-objects-more/8-decorators/1-logging-decorator/solution.md +++ /dev/null @@ -1,44 +0,0 @@ -Возвратим декоратор `wrapper` который будет записывать аргумент в `log` и передавать вызов в `f`: - -```js -//+ run -function work(a) { - /*...*/ // work - произвольная функция, один аргумент -} - -function makeLogging(f, log) { - -*!* - function wrapper(a) { - log.push(a); - return f.call(this, a); - } -*/!* - - return wrapper; -} - -var log = []; -work = makeLogging(work, log); - -work(1); // 1 -work(5); // 5 - -for (var i = 0; i < log.length; i++) { - alert( 'Лог:' + log[i] ); // "Лог:1", затем "Лог:5" -} -``` - -**Обратите внимание, вызов функции осуществляется как `f.call(this, a)`, а не просто `f(a)`.** - -Передача контекста необходима, чтобы декоратор корректно работал с методами объекта. Например: - -```js -user.method = makeLogging(user.method, log); -``` - -Теперь при вызове `user.method(...)` в декоратор будет передаваться контекст `this`, который надо передать исходной функции через `call/apply`. - - - - diff --git a/1-js/6-objects-more/8-decorators/1-logging-decorator/task.md b/1-js/6-objects-more/8-decorators/1-logging-decorator/task.md deleted file mode 100644 index e1efa4f8..00000000 --- a/1-js/6-objects-more/8-decorators/1-logging-decorator/task.md +++ /dev/null @@ -1,32 +0,0 @@ -# Логирующий декоратор (1 аргумент) - -[importance 5] - -Создайте декоратор `makeLogging(f, log)`, который берет функцию `f` и массив `log`. - -Он должен возвращать обёртку вокруг `f`, которая при каждом вызове записывает ("логирует") аргументы в `log`, а затем передает вызов в `f`. - -**В этой задаче можно считать, что у функции `f` ровно один аргумент.** - -Работать должно так: - -```js -function work(a) { - /* ... */ // work - произвольная функция, один аргумент -} - -function makeLogging(f, log) { /* ваш код */ } - -var log = []; -work = makeLogging(work, log); - -work(1); // 1, добавлено в log -work(5); // 5, добавлено в log - -for (var i = 0; i < log.length; i++) { -*!* - alert( 'Лог:' + log[i] ); // "Лог:1", затем "Лог:5" -*/!* -} -``` - diff --git a/1-js/6-objects-more/8-decorators/2-logging-decorator-arguments/_js.view/solution.js b/1-js/6-objects-more/8-decorators/2-logging-decorator-arguments/_js.view/solution.js deleted file mode 100644 index f7052f65..00000000 --- a/1-js/6-objects-more/8-decorators/2-logging-decorator-arguments/_js.view/solution.js +++ /dev/null @@ -1,9 +0,0 @@ -function makeLogging(f, log) { - - function wrapper() { - log.push([].slice.call(arguments)); - return f.apply(this, arguments); - } - - return wrapper; -} \ No newline at end of file diff --git a/1-js/6-objects-more/8-decorators/2-logging-decorator-arguments/_js.view/test.js b/1-js/6-objects-more/8-decorators/2-logging-decorator-arguments/_js.view/test.js deleted file mode 100644 index eb29c837..00000000 --- a/1-js/6-objects-more/8-decorators/2-logging-decorator-arguments/_js.view/test.js +++ /dev/null @@ -1,55 +0,0 @@ -describe("makeLogging", function() { - it("записывает вызовы в массив log", function() { - var work = sinon.spy(); - - var log = []; - work = makeLogging(work, log); - assert.deepEqual(log, []); - - work(1, 2); - assert.deepEqual(log, [ - [1, 2] - ]); - - work(3, 4); - assert.deepEqual(log, [ - [1, 2], - [3, 4] - ]); - }); - - it("передаёт вызов функции, возвращает её результат", function() { - var log = []; - - function sum(a, b) { - return a + b; - } - - sum = sinon.spy(sum); - var spy = sum; - sum = makeLogging(sum, log); - - assert.equal(sum(1, 2), 3); - assert(spy.calledWith(1, 2)); - }); - - - it("сохраняет контекст вызова для методов объекта", function() { - var log = []; - - var calculator = { - sum: function(a, b) { - return a + b; - } - } - - calculator.sum = sinon.spy(calculator.sum); - var spy = calculator.sum; - calculator.sum = makeLogging(calculator.sum, log); - - assert.equal(calculator.sum(1, 2), 3); - assert(spy.calledWith(1, 2)); - assert(spy.calledOn(calculator)); - }); - -}); \ No newline at end of file diff --git a/1-js/6-objects-more/8-decorators/2-logging-decorator-arguments/solution.md b/1-js/6-objects-more/8-decorators/2-logging-decorator-arguments/solution.md deleted file mode 100644 index dfc2b902..00000000 --- a/1-js/6-objects-more/8-decorators/2-logging-decorator-arguments/solution.md +++ /dev/null @@ -1,34 +0,0 @@ -Решение аналогично задаче [](/task/logging-decorator), разница в том, что в лог вместо одного аргумента идет весь объект `arguments`. - -Для передачи вызова с произвольным количеством аргументов используем `f.apply(this, arguments)`. - -```js -//+ run -function work(a, b) { - alert( a + b ); // work - произвольная функция -} - -function makeLogging(f, log) { - -*!* - function wrapper() { - log.push([].slice.call(arguments)); - return f.apply(this, arguments); - } -*/!* - - return wrapper; -} - -var log = []; -work = makeLogging(work, log); - -work(1, 2); // 3 -work(4, 5); // 9 - -for (var i = 0; i < log.length; i++) { - var args = log[i]; // массив из аргументов i-го вызова - alert( 'Лог:' + args.join() ); // "Лог:1,2", "Лог:4,5" -} -``` - diff --git a/1-js/6-objects-more/8-decorators/2-logging-decorator-arguments/task.md b/1-js/6-objects-more/8-decorators/2-logging-decorator-arguments/task.md deleted file mode 100644 index e5ab5b6b..00000000 --- a/1-js/6-objects-more/8-decorators/2-logging-decorator-arguments/task.md +++ /dev/null @@ -1,29 +0,0 @@ -# Логирующий декоратор (много аргументов) - -[importance 3] - -Создайте декоратор `makeLogging(func, log)`, для функции `func` возвращающий обёртку, которая при каждом вызове добавляет её аргументы в массив `log`. - -Условие аналогично задаче [](/task/logging-decorator), но допускается `func` с любым набором аргументов. - -Работать должно так: - -```js -function work(a, b) { - alert( a + b ); // work - произвольная функция -} - -function makeLogging(f, log) { /* ваш код */ } - -var log = []; -work = makeLogging(work, log); - -work(1, 2); // 3 -work(4, 5); // 9 - -for (var i = 0; i < log.length; i++) { - var args = log[i]; // массив из аргументов i-го вызова - alert( 'Лог:' + args.join() ); // "Лог:1,2", "Лог:4,5" -} -``` - diff --git a/1-js/6-objects-more/8-decorators/3-caching-decorator/_js.view/solution.js b/1-js/6-objects-more/8-decorators/3-caching-decorator/_js.view/solution.js deleted file mode 100644 index dc865601..00000000 --- a/1-js/6-objects-more/8-decorators/3-caching-decorator/_js.view/solution.js +++ /dev/null @@ -1,11 +0,0 @@ -function makeCaching(f) { - var cache = {}; - - return function(x) { - if (!(x in cache)) { - cache[x] = f.call(this, x); - } - return cache[x]; - }; - -} \ No newline at end of file diff --git a/1-js/6-objects-more/8-decorators/3-caching-decorator/_js.view/test.js b/1-js/6-objects-more/8-decorators/3-caching-decorator/_js.view/test.js deleted file mode 100644 index aed6f0fe..00000000 --- a/1-js/6-objects-more/8-decorators/3-caching-decorator/_js.view/test.js +++ /dev/null @@ -1,31 +0,0 @@ -describe("makeCaching", function() { - - it("запоминает предыдущее значение функции с таким аргументом", function() { - function f(x) { - return Math.random() * x; - } - - f = makeCaching(f); - - var a = f(1); - var b = f(1); - assert.equal(a, b); - - var anotherValue = f(2); - // почти наверняка другое значение - assert.notEqual(a, anotherValue); - }); - - it("сохраняет контекст вызова", function() { - var obj = { - spy: sinon.spy() - }; - - var spy = obj.spy; - obj.spy = makeCaching(obj.spy); - obj.spy(123); - assert(spy.calledWith(123)); - assert(spy.calledOn(obj)); - }); - -}); \ No newline at end of file diff --git a/1-js/6-objects-more/8-decorators/3-caching-decorator/solution.md b/1-js/6-objects-more/8-decorators/3-caching-decorator/solution.md deleted file mode 100644 index 9b413f92..00000000 --- a/1-js/6-objects-more/8-decorators/3-caching-decorator/solution.md +++ /dev/null @@ -1,34 +0,0 @@ -Запоминать результаты вызова функции будем в замыкании, в объекте `cache: { ключ:значение }`. - -```js -//+ run no-beautify -function f(x) { - return Math.random()*x; -} - -*!* -function makeCaching(f) { - var cache = {}; - - return function(x) { - if (!(x in cache)) { - cache[x] = f.call(this, x); - } - return cache[x]; - }; - -} -*/!* - -f = makeCaching(f); - -var a = f(1); -var b = f(1); -alert( a == b ); // true (значение закешировано) - -b = f(2); -alert( a == b ); // false, другой аргумент => другое значение -``` - -Обратите внимание: проверка на наличие уже подсчитанного значения выглядит так: `if (x in cache)`. Менее универсально можно проверить так: `if (cache[x])`, это если мы точно знаем, что `cache[x]` никогда не будет `false`, `0` и т.п. - diff --git a/1-js/6-objects-more/8-decorators/3-caching-decorator/task.md b/1-js/6-objects-more/8-decorators/3-caching-decorator/task.md deleted file mode 100644 index f0b3a78f..00000000 --- a/1-js/6-objects-more/8-decorators/3-caching-decorator/task.md +++ /dev/null @@ -1,34 +0,0 @@ -# Кеширующий декоратор - -[importance 5] - -Создайте декоратор `makeCaching(f)`, который берет функцию `f` и возвращает обертку, которая кеширует её результаты. - -**В этой задаче функция `f` имеет только один аргумент, и он является числом.** - -
        -
      1. При первом вызове обертки с определенным аргументом -- она вызывает `f` и запоминает значение.
      2. -
      3. При втором и последующих вызовах с тем же аргументом возвращается запомненное значение.
      4. -
      - -Должно работать так: - -```js -function f(x) { - return Math.random() * x; // random для удобства тестирования -} - -function makeCaching(f) { /* ваш код */ } - -f = makeCaching(f); - -var a, b; - -a = f(1); -b = f(1); -alert( a == b ); // true (значение закешировано) - -b = f(2); -alert( a == b ); // false, другой аргумент => другое значение -``` - diff --git a/1-js/6-objects-more/8-decorators/article.md b/1-js/6-objects-more/8-decorators/article.md deleted file mode 100644 index f089df90..00000000 --- a/1-js/6-objects-more/8-decorators/article.md +++ /dev/null @@ -1,232 +0,0 @@ -# Функции-обёртки, декораторы - -JavaScript предоставляет удивительно гибкие возможности по работе с функциями: их можно передавать, в них можно записывать данные как в объекты, у них есть свои встроенные методы... - -Конечно, этим нужно уметь пользоваться. В этой главе, чтобы более глубоко понимать работу с функциями, мы рассмотрим создание функций-обёрток или, иначе говоря, "декораторов". - -[cut] - -[Декоратор](http://en.wikipedia.org/wiki/Decorator_pattern) -- приём программирования, который позволяет взять существующую функцию и изменить/расширить ее поведение. - -*Декоратор* получает функцию и возвращает обертку, которая делает что-то своё "вокруг" вызова основной функции. - -## bind -- привязка контекста - -Один простой декоратор вы уже видели ранее -- это функция [bind](/bind): - -```js -function bind(func, context) { - return function() { - return func.apply(context, arguments); - }; -} -``` - -Вызов `bind(func, context)` возвращает обёртку, которая ставит `this` и передаёт основную работу функции `func`. - -## Декоратор-таймер - -Создадим более сложный декоратор, замеряющий время выполнения функции. - -Он будет называться `timingDecorator` и получать функцию вместе с "названием таймера", а возвращать -- функцию-обёртку, которая измеряет время и прибавляет его в специальный объект `timer` по свойству-названию. - -Использование: -```js -function f(x) {} // любая функция - -var timers = {}; // объект для таймеров - -// отдекорировали -f = timingDecorator(f, "myFunc"); - -// запускаем -f(1); -f(2); -f(3); // функция работает как раньше, но время подсчитывается - -alert( timers.myFunc ); // общее время выполнения всех вызовов f -``` - -При помощи декоратора `timingDecorator` мы сможем взять произвольную функцию и одним движением руки прикрутить к ней измеритель времени. - -Его реализация: - -```js -//+ run -var timers = {}; - -// прибавит время выполнения f к таймеру timers[timer] -function timingDecorator(f, timer) { - return function() { - var start = performance.now(); - - var result = f.apply(this, arguments); // (*) - - if (!timers[timer]) timers[timer] = 0; - timers[timer] += performance.now() - start; - - return result; - } -} - -// функция может быть произвольной, например такой: -function fibonacci(n) { - return (n > 2) ? fibonacci(n - 1) + fibonacci(n - 2) : 1; -} - -*!* -// использование: завернём fibonacci в декоратор -fibonacci = timingDecorator(fibonacci, "fibo"); -*/!* - -// неоднократные вызовы... -alert( fibonacci(10) ); // 55 -alert( fibonacci(20) ); // 6765 -// ... - -*!* -// в любой момент можно получить общее количество времени на вызовы -alert( timers.fibo + 'мс' ); -*/!* -``` - -Обратим внимание на строку `(*)` внутри декоратора, которая и осуществляет передачу вызова: - -```js -var result = f.apply(this, arguments); // (*) -``` - -Этот приём называется "форвардинг вызова" (от англ. forwarding): текущий контекст и аргументы через `apply` передаются в функцию `f`, так что изнутри `f` всё выглядит так, как была вызвана она напрямую, а не декоратор. - -## Декоратор для проверки типа - -В JavaScript, как правило, пренебрегают проверками типа. В функцию, которая должна получать число, может быть передана строка, булево значение или даже объект. - -Например: - -```js -//+ no-beautify -function sum(a, b) { - return a + b; -} - -// передадим в функцию для сложения чисел нечисловые значения -alert( sum(true, { name: "Вася", age: 35 }) ); // true[Object object] -``` - -Функция "как-то" отработала, но в реальной жизни передача в `sum` подобных значений, скорее всего, будет следствием программной ошибки. Всё-таки `sum` предназначена для суммирования чисел, а не объектов. - -Многие языки программирования позволяют прямо в объявлении функции указать, какие типы данных имеют параметры. И это удобно, поскольку повышает надёжность кода. - -В JavaScript же проверку типов приходится делать дополнительным кодом в начале функции, который во-первых обычно лень писать, а во-вторых он увеличивает общий объем текста, тем самым ухудшая читаемость. - -**Декораторы способны упростить рутинные, повторяющиеся задачи, вынести их из кода функции.** - -Например, создадим декоратор, который принимает функцию и массив, который описывает для какого аргумента какую проверку типа применять: - -```js -//+ run -// вспомогательная функция для проверки на число -function checkNumber(value) { - return typeof value == 'number'; -} - -// декоратор, проверяющий типы для f -// второй аргумент checks - массив с функциями для проверки -function typeCheck(f, checks) { - return function() { - for (var i = 0; i < arguments.length; i++) { - if (!checks[i](arguments[i])) { - alert( "Некорректный тип аргумента номер " + i ); - return; - } - } - return f.apply(this, arguments); - } -} - -function sum(a, b) { - return a + b; -} - -*!* -// обернём декоратор для проверки -sum = typeCheck(sum, [checkNumber, checkNumber]); // оба аргумента - числа -*/!* - -// пользуемся функцией как обычно -alert( sum(1, 2) ); // 3, все хорошо - -*!* -// а вот так - будет ошибка -sum(true, null); // некорректный аргумент номер 0 -sum(1, ["array", "in", "sum?!?"]); // некорректный аргумент номер 1 -*/!* -``` - -Конечно, этот декоратор можно ещё расширять, улучшать, дописывать проверки, но... Вы уже поняли принцип, не правда ли? - -**Один раз пишем декоратор и дальше просто применяем этот функционал везде, где нужно.** - -## Декоратор проверки доступа - -И наконец посмотрим ещё один, последний пример. - -Предположим, у нас есть функция `isAdmin()`, которая возвращает `true`, если у посетителя есть права администратора. - -Можно создать декоратор `checkPermissionDecorator`, который добавляет в любую функцию проверку прав: - -Например, создадим декоратор `checkPermissionDecorator(f)`. Он будет возвращать обертку, которая передает вызов `f` в том случае, если у посетителя достаточно прав: - -```js -function checkPermissionDecorator(f) { - return function() { - if (isAdmin()) { - return f.apply(this, arguments); - } - alert( 'Недостаточно прав' ); - } -} -``` - -Использование декоратора: - -```js -//+ no-beautify -function save() { ... } - -save = checkPermissionDecorator(save); -// Теперь вызов функции save() проверяет права -``` - -## Итого - -Декоратор -- это обёртка над функцией, которая модифицирует её поведение. При этом основную работу по-прежнему выполняет функция. - -**Декораторы можно не только повторно использовать, но и комбинировать!** - -Это кардинально повышает их выразительную силу. Декораторы можно рассматривать как своего рода "фичи" или возможности, которые можно "нацепить" на любую функцию. Можно один, а можно несколько. - -Скажем, используя декораторы, описанные выше, можно добавить к функции возможности по проверке типов данных, замеру времени и проверке доступа буквально одной строкой, не залезая при этом в её код, то есть (!) не увеличивая его сложность. - -Предлагаю вашему вниманию задачи, которые помогут выяснить, насколько вы разобрались в декораторах. Далее в учебнике мы ещё встретимся с ними. - - - -[head] - -[/head] \ No newline at end of file diff --git a/1-js/6-objects-more/index.md b/1-js/6-objects-more/index.md deleted file mode 100644 index 94f1be86..00000000 --- a/1-js/6-objects-more/index.md +++ /dev/null @@ -1,3 +0,0 @@ -# Методы объектов и контекст вызова - -Начинаем изучать объектно-ориентированную разработку -- как работают объекты и функции, что такое контекст вызова и способы его передачи. \ No newline at end of file diff --git a/1-js/7-js-misc/1-class-instanceof/1-format-date-polymorphic/_js.view/solution.js b/1-js/7-js-misc/1-class-instanceof/1-format-date-polymorphic/_js.view/solution.js deleted file mode 100644 index 48113fa4..00000000 --- a/1-js/7-js-misc/1-class-instanceof/1-format-date-polymorphic/_js.view/solution.js +++ /dev/null @@ -1,32 +0,0 @@ -function formatDate(date) { - if (typeof date == 'number') { - // перевести секунды в миллисекунды и преобразовать к Date - date = new Date(date * 1000); - } else if (typeof date == 'string') { - // строка в стандартном формате автоматически будет разобрана в дату - date = new Date(date); - } else if (Array.isArray(date)) { - date = new Date(date[0], date[1], date[2]); - } - // преобразования для поддержки полиморфизма завершены, - // теперь мы работаем с датой (форматируем её) - - return date.toLocaleString("ru", {day: '2-digit', month: '2-digit', year: '2-digit'}); - - /* - // можно и вручную, если лень добавлят в старый IE поддержку локализации - var day = date.getDate(); - if (day < 10) day = '0' + day; - - var month = date.getMonth() + 1; - if (month < 10) month = '0' + month; - - // взять 2 последние цифры года - var year = date.getFullYear() % 100; - if (year < 10) year = '0' + year; - - var formattedDate = day + '.' + month + '.' + year; - - return formattedDate; - */ -} \ No newline at end of file diff --git a/1-js/7-js-misc/1-class-instanceof/1-format-date-polymorphic/_js.view/test.js b/1-js/7-js-misc/1-class-instanceof/1-format-date-polymorphic/_js.view/test.js deleted file mode 100644 index a458b62f..00000000 --- a/1-js/7-js-misc/1-class-instanceof/1-format-date-polymorphic/_js.view/test.js +++ /dev/null @@ -1,18 +0,0 @@ -describe("formatDate", function() { - it("читает дату вида гггг-мм-дд из строки", function() { - assert.equal(formatDate('2011-10-02'), "02.10.11"); - }); - - it("читает дату из числа 1234567890 (миллисекунды)", function() { - assert.equal(formatDate(1234567890), "14.02.09"); - }); - - it("читает дату из массива вида [гггг, м, д]", function() { - assert.equal(formatDate([2014, 0, 1]), "01.01.14"); - }); - - it("читает дату из объекта Date", function() { - assert.equal(formatDate(new Date(2014, 0, 1)), "01.01.14"); - }); - -}); \ No newline at end of file diff --git a/1-js/7-js-misc/1-class-instanceof/1-format-date-polymorphic/solution.md b/1-js/7-js-misc/1-class-instanceof/1-format-date-polymorphic/solution.md deleted file mode 100644 index 878033e9..00000000 --- a/1-js/7-js-misc/1-class-instanceof/1-format-date-polymorphic/solution.md +++ /dev/null @@ -1,15 +0,0 @@ -Для определения примитивного типа строка/число подойдет оператор [typeof](#type-typeof). - -Примеры его работы: - -```js -//+ run -alert( typeof 123 ); // "number" -alert( typeof "строка" ); // "string" -alert( typeof new Date() ); // "object" -alert( typeof [] ); // "object" -``` - -Оператор `typeof` не умеет различать разные типы объектов, они для него все на одно лицо: `"object"`. Поэтому он не сможет отличить `Date` от `Array`. - -Для отличия `Array` используем вызов `Array.isArray`. Если он неверен, значит у нас дата. \ No newline at end of file diff --git a/1-js/7-js-misc/1-class-instanceof/1-format-date-polymorphic/task.md b/1-js/7-js-misc/1-class-instanceof/1-format-date-polymorphic/task.md deleted file mode 100644 index 4d4176da..00000000 --- a/1-js/7-js-misc/1-class-instanceof/1-format-date-polymorphic/task.md +++ /dev/null @@ -1,26 +0,0 @@ -# Полиморфная функция formatDate - -[importance 5] - -Напишите функцию `formatDate(date)`, которая возвращает дату в формате `dd.mm.yy`. - -Ее первый аргумент должен содержать дату в одном из видов: -
        -
      1. Как объект `Date`.
      2. -
      3. Как строку, например `yyyy-mm-dd` или другую в стандартном формате даты.
      4. -
      5. Как число *секунд* с `01.01.1970`.
      6. -
      7. Как массив `[гггг, мм, дд]`, месяц начинается с нуля
      8. -
      -Для этого вам понадобится определить тип данных аргумента и, при необходимости, преобразовать входные данные в нужный формат. - -Пример работы: - -```js -function formatDate(date) { /* ваш код */ } - -alert( formatDate('2011-10-02') ); // 02.10.11 -alert( formatDate(1234567890) ); // 14.02.09 -alert( formatDate([2014, 0, 1]) ); // 01.01.14 -alert( formatDate(new Date(2014, 0, 1)) ); // 01.01.14 -``` - diff --git a/1-js/7-js-misc/1-class-instanceof/article.md b/1-js/7-js-misc/1-class-instanceof/article.md deleted file mode 100644 index 54b519b2..00000000 --- a/1-js/7-js-misc/1-class-instanceof/article.md +++ /dev/null @@ -1,252 +0,0 @@ -# Типы данных: [[Class]], instanceof и утки - -Время от времени бывает удобно создавать так называемые "полиморфные" функции, то есть такие, которые по-разному обрабатывают аргументы, в зависимости от их типа. Например, функция вывода может по-разному форматировать числа и даты. - -Для реализации такой возможности нужен способ определить тип переменной. - -## Оператор typeof - -Мы уже знакомы с простейшим способом -- оператором [typeof](#type-typeof). - -Оператор `typeof` надежно работает с примитивными типами, кроме `null`, а также с функциями. Он возвращает для них тип в виде строки: - -```js -//+ run no-beautify -alert( typeof 1 ); // 'number' -alert( typeof true ); // 'boolean' -alert( typeof "Текст" ); // 'string' -alert( typeof undefined ); // 'undefined' -alert( typeof null ); // 'object' (ошибка в языке) -alert( typeof alert ); // 'function' -``` - -...Но все объекты, включая массивы и даты для `typeof` -- на одно лицо, они имеют один тип `'object'`: - -```js -//+ run -alert( typeof {} ); // 'object' -alert( typeof [] ); // 'object' -alert( typeof new Date ); // 'object' -``` - -Поэтому различить их при помощи `typeof` нельзя, и в этом его основной недостаток. - -## Секретное свойство [[Class]] - -Для встроенных объектов есть одна "секретная" возможность узнать их тип, которая связана с методом `toString`. - -Во всех встроенных объектах есть специальное свойство `[[Class]]`, в котором хранится информация о его типе или конструкторе. - -Оно взято в квадратные скобки, так как это свойство -- внутреннее. Явно получить его нельзя, но можно прочитать его "в обход", воспользовавшись методом `toString` стандартного объекта `Object`. - -Его внутренняя реализация выводит `[[Class]]` в небольшом обрамлении, как `"[object значение]"`. - -Например: - -```js -//+ run -var toString = {}.toString; - -var arr = [1, 2]; -alert( toString.call(arr) ); // [object Array] - -var date = new Date; -alert( toString.call(date) ); // [object Date] - -var user = { name: "Вася" }; -alert( toString.call(user) ); // [object Object] -``` - -В первой строке мы взяли метод `toString`, принадлежащий именно стандартному объекту `{}`. Нам пришлось это сделать, так как у `Date` и `Array` -- свои собственные методы `toString`, которые работают иначе. - -Затем мы вызываем этот `toString` в контексте нужного объекта `obj`, и он возвращает его внутреннее, невидимое другими способами, свойство `[[Class]]`. - -**Для получения `[[Class]]` нужна именно внутренняя реализация `toString` стандартного объекта `Object`, другая не подойдёт.** - -К счастью, методы в JavaScript -- это всего лишь функции-свойства объекта, которые можно скопировать в переменную и применить на другом объекте через `call/apply`. Что мы и делаем для `{}.toString`. - -Метод также можно использовать с примитивами: - -```js -//+ run -alert( {}.toString.call(123) ); // [object Number] -alert( {}.toString.call("строка") ); // [object String] -``` - -[warn header="Вызов `{}.toString` в консоли может выдать ошибку"] -При тестировании кода в консоли вы можете обнаружить, что если ввести в командную строку `{}.toString.call(...)` -- будет ошибка. С другой стороны, вызов `alert( {}.toString... )` -- работает. - -Эта ошибка возникает потому, что фигурные скобки `{ }` в основном потоке кода интерпретируются как блок. Интерпретатор читает `{}.toString.call(...)` так: - -```js -//+ no-beautify -{ } // пустой блок кода -.toString.call(...) // а что это за точка в начале? не понимаю, ошибка! -``` - -Фигурные скобки считаются объектом, только если они находятся в контексте выражения. В частности, оборачивание в скобки `( {}.toString... )` тоже сработает нормально. -[/warn] - - -Для большего удобства можно сделать функцию `getClass`, которая будет возвращать только сам `[[Class]]`: - -```js -//+ run -function getClass(obj) { - return {}.toString.call(obj).slice(8, -1); -} - -alert( getClass(new Date) ); // Date -alert( getClass([1, 2, 3]) ); // Array -``` - -Заметим, что свойство `[[Class]]` есть и доступно для чтения указанным способом -- у всех *встроенных* объектов. Но его нет у объектов, которые создают *наши функции*. Точнее, оно есть, но равно всегда `"Object"`. - -Например: - -```js -//+ run -function User() {} - -var user = new User(); - -alert( {}.toString.call(user) ); // [object Object], не [object User] -``` - -Поэтому узнать тип таким образом можно только для встроенных объектов. - -## Метод Array.isArray() - -Для проверки на массивов есть специальный метод: `Array.isArray(arr)`. Он возвращает `true` только если `arr` -- массив: - -```js -//+ run -alert( Array.isArray([1,2,3]) ); // true -alert( Array.isArray("not array")); // false -``` - -Но этот метод -- единственный в своём роде. - -Других аналогичных, типа `Object.isObject`, `Date.isDate` -- нет. - - -## Оператор instanceof - -Оператор `instanceof` позволяет проверить, создан ли объект данной функцией, причём работает для любых функций -- как встроенных, так и наших. - -```js -//+ run -function User() {} - -var user = new User(); - -alert( user instanceof User ); // true -``` - -Таким образом, `instanceof`, в отличие от `[[Class]]` и `typeof` может помочь выяснить тип для новых объектов, созданных нашими конструкторами. - -Заметим, что оператор `instanceof` -- сложнее, чем кажется. Он учитывает наследование, которое мы пока не проходили, но скоро изучим, и затем вернёмся к `instanceof` в главе [](/instanceof). - - -## Утиная типизация - -Альтернативный подход к типу -- "утиная типизация", которая основана на одной известной пословице: *"If it looks like a duck, swims like a duck and quacks like a duck, then it probably is a duck (who cares what it really is)"*. - -В переводе: *"Если это выглядит как утка, плавает как утка и крякает как утка, то, вероятно, это утка (какая разница, что это на самом деле)"*. - -Смысл утиной типизации -- в проверке необходимых методов и свойств. - -Например, мы можем проверить, что объект -- массив, не вызывая `Array.isArray`, а просто уточнив наличие важного для нас метода, например `splice`: - -```js -//+ run -var something = [1, 2, 3]; - -if (something.splice) { - alert( 'Это утка! То есть, массив!' ); -} -``` - -Обратите внимание -- в `if` мы не вызываем метод `something.splice()`, а пробуем получить само свойство `something.splice`. Для массивов оно всегда есть и является функцией, т.е. даст в логическом контексте `true`. - -Проверить на дату можно, определив наличие метода `getTime`: - -```js -//+ run -var x = new Date(); - -if (x.getTime) { - alert( 'Дата!' ); - alert( x.getTime() ); // работаем с датой -} -``` - -С виду такая проверка хрупка, ее можно "сломать", передав похожий объект с тем же методом. - -Но как раз в этом и есть смысл утиной типизации: если объект похож на дату, у него есть методы даты, то будем работать с ним как с датой (какая разница, что это на самом деле). - -То есть, мы намеренно позволяем передать в код нечто менее конкретное, чем определённый тип, чтобы сделать его более универсальным. - -[smart header="Проверка интерфейса"] -Если говорить словами "классического программирования", то "duck typing" -- это проверка реализации объектом требуемого интерфейса. Если реализует -- ок, используем его. Если нет -- значит это что-то другое. -[/smart] - - -## Пример полиморфной функции - -Пример полиморфной функции -- `sayHi(who)`, которая будет говорить "Привет" своему аргументу, причём если передан массив -- то "Привет" каждому: - -```js -//+ run -function sayHi(who) { - - if (Array.isArray(who)) { - who.forEach(sayHi); - } else { - alert( 'Привет, ' + who ); - } -} - -// Вызов с примитивным аргументом -sayHi("Вася"); // Привет, Вася - -// Вызов с массивом -sayHi(["Саша", "Петя"]); // Привет, Саша... Петя - -// Вызов с вложенными массивами - тоже работает! -sayHi(["Саша", "Петя", ["Маша", "Юля"]]); // Привет Саша..Петя..Маша..Юля -``` - -Проверку на массив в этом примере можно заменить на "утиную" -- нам ведь нужен только метод `forEach`: - -```js -//+ run -function sayHi(who) { - - if (who.forEach) { // если есть forEach - who.forEach(sayHi); // предполагаем, что он ведёт себя "как надо" - } else { - alert( 'Привет, ' + who ); - } -} -``` - -## Итого - -Для написания полиморфных (это удобно!) функций нам нужна проверка типов. - -
        -
      • Для примитивов с ней отлично справляется оператор `typeof`. - -У него две особенности: -
          -
        1. Он считает `null` объектом, это внутренняя ошибка в языке.
        2. -
        3. Для функций он возвращает `function`, по стандарту функция не считается базовым типом, но на практике это удобно и полезно.
        4. -
        -
      • -
      • Для встроенных объектов мы можем получить тип из скрытого свойства `[[Class]]`, при помощи вызова `{}.toString.call(obj).slice(8, -1)`. Не работает для конструкторов, которые объявлены нами. -
      • -
      • Оператор `obj instanceof Func` проверяет, создан ли объект `obj` функцией `Func`, работает для любых конструкторов. Более подробно мы разберём его в главе [](/instanceof).
      • -
      • И, наконец, зачастую достаточно проверить не сам тип, а просто наличие нужных свойств или методов. Это называется "утиная типизация".
      • -
      - diff --git a/1-js/7-js-misc/2-json/1-serialize-object/solution.md b/1-js/7-js-misc/2-json/1-serialize-object/solution.md deleted file mode 100644 index 0893b44e..00000000 --- a/1-js/7-js-misc/2-json/1-serialize-object/solution.md +++ /dev/null @@ -1,12 +0,0 @@ - - -```js -var leader = { - name: "Василий Иванович", - age: 35 -}; - -var leaderStr = JSON.stringify(leader); -leader = JSON.parse(leaderStr); -``` - diff --git a/1-js/7-js-misc/2-json/1-serialize-object/task.md b/1-js/7-js-misc/2-json/1-serialize-object/task.md deleted file mode 100644 index cc46554d..00000000 --- a/1-js/7-js-misc/2-json/1-serialize-object/task.md +++ /dev/null @@ -1,14 +0,0 @@ -# Превратите объект в JSON - -[importance 3] - -Превратите объект `leader` из примера ниже в JSON: - -```js -var leader = { - name: "Василий Иванович", - age: 35 -}; -``` - -После этого прочитайте получившуюся строку обратно в объект. diff --git a/1-js/7-js-misc/2-json/2-serialize-object-circular/solution.md b/1-js/7-js-misc/2-json/2-serialize-object-circular/solution.md deleted file mode 100644 index 0ec62c2b..00000000 --- a/1-js/7-js-misc/2-json/2-serialize-object-circular/solution.md +++ /dev/null @@ -1,64 +0,0 @@ -# Ответ на первый вопрос - -Обычный вызов `JSON.stringify(team)` выдаст ошибку, так как объекты `leader` и `soldier` внутри структуры ссылаются друг на друга. - -Формат JSON не предусматривает средств для хранения ссылок. - -# Варианты решения - -Чтобы превращать такие структуры в JSON, обычно используются два подхода: - -
        -
      1. Добавить в `team` свой код `toJSON`: - -```js -team.toJSON = function() { - /* свой код, который может создавать копию объекта без круговых ссылок и передавать управление JSON.stringify */ -} -``` - -При этом, конечно, понадобится и своя функция чтения из JSON, которая будет восстанавливать объект, а затем дополнять его круговыми ссылками. -
      2. -
      3. Можно учесть возможную проблему в самой структуре, используя вместо ссылок `id`. Как правило, это несложно, ведь на сервере у данных тоже есть идентификаторы. - -Изменённая структура может выглядеть так: - -```js -var leader = { - id: 12, - name: "Василий Иванович" -}; - -var soldier = { - id: 51, - name: "Петька" -}; - -*!* -// поменяли прямую ссылку на ID -leader.soldierId = 51; -soldier.leaderId = 12; -*/!* - -var team = { - 12: leader, - 51: soldier -}; -``` - -..Но действительно ли это решение будет оптимальным? Использовать структуру стало сложнее, и вряд ли это изменение стоит делать лишь из-за JSON. Вот если есть другие преимущества, тогда можно подумать. -
      4. -
      - -Универсальный вариант подхода, описанного выше -- это использование особой реализации JSON, которая не входит в стандарт и поддерживает расширенный формат для поддержки ссылок. - -Она, к примеру, есть во фреймворке Dojo. - -При вызове `dojox.json.ref.toJson(team)` будет создано следующее строковое представление: - -```js -//+ no-beautify -[{"name":"Василий Иванович","soldier":{"name":"Петька","leader":{"$ref":"#0"}}},{"$ref":"#0.soldier"}] -``` - -Метод разбора такой строки -- также свой: `dojox.json.ref.fromJson`. \ No newline at end of file diff --git a/1-js/7-js-misc/2-json/2-serialize-object-circular/task.md b/1-js/7-js-misc/2-json/2-serialize-object-circular/task.md deleted file mode 100644 index 7aa131ef..00000000 --- a/1-js/7-js-misc/2-json/2-serialize-object-circular/task.md +++ /dev/null @@ -1,26 +0,0 @@ -# Превратите объекты со ссылками в JSON - -[importance 3] - -Превратите объект `team` из примера ниже в JSON: - -```js -var leader = { - name: "Василий Иванович" -}; - -var soldier = { - name: "Петька" -}; - -// эти объекты ссылаются друг на друга! -leader.soldier = soldier; -soldier.leader = leader; - -var team = [leader, soldier]; -``` - -
        -
      1. Может ли это сделать прямой вызов `JSON.stringify(team)`? Если нет, то почему?
      2. -
      3. Какой подход вы бы предложили для чтения и восстановления таких объектов?
      4. -
      \ No newline at end of file diff --git a/1-js/7-js-misc/2-json/article.md b/1-js/7-js-misc/2-json/article.md deleted file mode 100644 index ad99b881..00000000 --- a/1-js/7-js-misc/2-json/article.md +++ /dev/null @@ -1,366 +0,0 @@ -# Формат JSON, метод toJSON - -В этой главе мы рассмотрим работу с форматом [JSON](http://ru.wikipedia.org/wiki/JSON), который используется для представления объектов в виде строки. - -Это один из наиболее удобных форматов данных при взаимодействии с JavaScript. Если нужно с сервера взять объект с данными и передать на клиенте, то в качестве промежуточного формата -- для передачи по сети, почти всегда используют именно его. - -В современных браузерах есть замечательные методы, знание тонкостей которых делает операции с JSON простыми и комфортными. - -[cut] - -## Формат JSON - -Данные в формате JSON ([RFC 4627](http://tools.ietf.org/html/rfc4627)) представляют собой: -
        -
      • JavaScript-объекты `{ ... }` или
      • -
      • Массивы `[ ... ]` или
      • -
      • Значения одного из типов: -
          -
        • строки в двойных кавычках,
        • -
        • число,
        • -
        • логическое значение `true`/`false`,
        • -
        • `null`.
        • -
        -
      • -
      - -Почти все языки программирования имеют библиотеки для преобразования объектов в формат JSON. - -Основные методы для работы с JSON в JavaScript -- это: -
        -
      • `JSON.parse` -- читает объекты из строки в формате JSON.
      • -
      • `JSON.stringify` -- превращает объекты в строку в формате JSON, используется, когда нужно из JavaScript передать данные по сети.
      • -
      - -## Метод JSON.parse - -Вызов `JSON.parse(str)` превратит строку с данными в формате JSON в JavaScript-объект/массив/значение. - -Например: - -```js -//+ run -var numbers = "[0, 1, 2, 3]"; - -numbers = JSON.parse(numbers); - -alert( numbers[1] ); // 1 -``` - -Или так: - -```js -//+ run -var user = '{ "name": "Вася", "age": 35, "isAdmin": false, "friends": [0,1,2,3] }'; - -user = JSON.parse(user); - -alert( user.friends[1] ); // 1 -``` - -Данные могут быть сколь угодно сложными, объекты и массивы могут включать в себя другие объекты и массивы. Главное чтобы они соответствовали формату. - -[warn header="JSON-объекты ≠ JavaScript-объекты"] -Объекты в формате JSON похожи на обычные JavaScript-объекты, но отличаются от них более строгими требованиями к строкам -- они должны быть именно в двойных кавычках. - -В частности, первые два свойства объекта ниже -- некорректны: - -```js -{ - *!*name*/!*: "Вася", // ошибка: ключ name без кавычек! - "surname": *!*'Петров'*/!*,// ошибка: одинарные кавычки у значения 'Петров'! - "age": 35 // .. а тут всё в порядке. - "isAdmin": false // и тут тоже всё ок -} -``` - -Кроме того, в формате JSON не поддерживаются комментарии. Он предназначен только для передачи данных. - -Есть нестандартное расширение формата JSON, которое называется [JSON5](http://json5.org/) и как раз разрешает ключи без кавычек, комментарии и т.п, как в обычном JavaScript. На данном этапе, это отдельная библиотека. -[/warn] - -## Умный разбор: JSON.parse(str, reviver) - -Метод `JSON.parse` поддерживает и более сложные алгоритмы разбора. - -Например, мы получили с сервера объект с данными события `event`. - -Он выглядит так: - -```js -// title: название собятия, date: дата события -var str = '{"title":"Конференция","date":"2012-11-30T12:00:00.000Z"}'; -``` - -...И теперь нужно *восстановить* его, то есть превратить в JavaScript-объект. - -Попробуем вызвать для этого `JSON.parse`: - -```js -//+ run -var str = '{"title":"Конференция","date":"2014-11-30T12:00:00.000Z"}'; - -var event = JSON.parse(str); - -*!* -alert( event.date.getDate() ); // ошибка! -*/!* -``` - -...Увы, ошибка! - -Дело в том, что значением `event.date` является строка, а отнюдь не объект `Date`. Откуда методу `JSON.parse` знать, что нужно превратить строку именно в дату? - -**Для интеллектуального восстановления из строки у `JSON.parse(str, reviver)` есть второй параметр `reviver`, который является функцией `function(key, value)`.** - -Если она указана, то в процессе чтения объекта из строки `JSON.parse` передаёт ей по очереди все создаваемые пары ключ-значение и может возвратить либо преобразованное значение, либо `undefined`, если его нужно пропустить. - -В данном случае мы можем создать правило, что ключ `date` всегда означает дату: - -```js -//+ run -// дата в строке - в формате UTC -var str = '{"title":"Конференция","date":"2014-11-30T12:00:00.000Z"}'; - -*!* -var event = JSON.parse(str, function(key, value) { - if (key == 'date') return new Date(value); - return value; -}); -*/!* - -alert( event.date.getDate() ); // теперь сработает! -``` - -Кстати, эта возможность работает и для вложенных объектов тоже: - -```js -//+ run -var schedule = '{ \ - "events": [ \ - {"title":"Конференция","date":"2014-11-30T12:00:00.000Z"}, \ - {"title":"День рождения","date":"2015-04-18T12:00:00.000Z"} \ - ]\ -}'; - -schedule = JSON.parse(schedule, function(key, value) { - if (key == 'date') return new Date(value); - return value; -}); - -*!* -alert( schedule.events[1].date.getDate() ); // сработает! -*/!* -``` - -## Сериализация, метод JSON.stringify - -Метод `JSON.stringify(value, replacer, space)` преобразует ("сериализует") значение в JSON-строку. - -Пример использования: - -```js -//+ run -var event = { - title: "Конференция", - date: "сегодня" -}; - -var str = JSON.stringify(event); -alert( str ); // {"title":"Конференция","date":"сегодня"} - -// Обратное преобразование. -event = JSON.parse(str); -``` - -**При сериализации объекта вызывается его метод `toJSON`.** - -Если такого метода нет -- перечисляются его свойства, кроме функций. - -Посмотрим это в примере посложнее: - -```js -//+ run -var room = { - number: 23, - occupy: function() { - alert( this.number ); - } -}; - -event = { - title: "Конференция", - date: new Date(Date.UTC(2014, 0, 1)), - room: room -}; - -alert( JSON.stringify(event) ); -/* - { - "title":"Конференция", - "date":"2014-01-01T00:00:00.000Z", // (1) - "room": {"number":23} // (2) - } -*/ -``` - -Обратим внимание на два момента: -
        -
      1. Дата превратилась в строку. Это не случайно: у всех дат есть встроенный метод `toJSON`. Его результат в данном случае -- строка в таймзоне UTC.
      2. -
      3. У объекта `room` нет метода `toJSON`. Поэтому он сериализуется перечислением свойств. - -Мы, конечно, могли бы добавить такой метод, тогда в итог попал бы его результат: - -```js -//+ run -var room = { - number: 23, -*!* - toJSON: function() { - return this.number; - } -*/!* -}; - -alert( JSON.stringify(room) ); // 23 -``` - -
      4. -
      - -### Исключение свойств - -Попытаемся преобразовать в JSON объект, содержащий ссылку на DOM. - -Например: - -```js -//+ run -var user = { - name: "Вася", - age: 25, - window: window -}; - -*!* -alert( JSON.stringify(user) ); // ошибка! -// TypeError: Converting circular structure to JSON (текст из Chrome) -*/!* -``` - -Произошла ошибка! В чём же дело, неужели некоторые объекты запрещены? Как видно из текста ошибки -- дело совсем в другом. Глобальный объект `window` -- сложная структура с кучей встроенных свойств и круговыми ссылками, поэтому его преобразовать невозможно. Да и нужно ли? - -**Во втором параметре `JSON.stringify(value, replacer)` можно указать массив свойств, которые подлежат сериализации.** - -Например: - -```js -//+ run -var user = { - name: "Вася", - age: 25, - window: window -}; - -*!* -alert( JSON.stringify(user, ["name", "age"]) ); -// {"name":"Вася","age":25} -*/!* -``` - -Для более сложных ситуаций вторым параметром можно передать функцию `function(key, value)`, которая возвращает сериализованное `value` либо `undefined`, если его не нужно включать в результат: - -```js -//+ run -var user = { - name: "Вася", - age: 25, - window: window -}; - -*!* -var str = JSON.stringify(user, function(key, value) { - if (key == 'window') return undefined; - return value; -}); -*/!* - -alert( str ); // {"name":"Вася","age":25} -``` - -В примере выше функция пропустит свойство с названием `window`. Для остальных она просто возвращает значение, передавая его стандартному алгоритму. А могла бы и как-то обработать. - -[smart header="Функция `replacer` работает рекурсивно"] -То есть, если объект содержит вложенные объекты, массивы и т.п., то все они пройдут через `replacer`. -[/smart] - -### Красивое форматирование - -В методе `JSON.stringify(value, replacer, space)` есть ещё третий параметр `space`. - -Если он является числом -- то уровни вложенности в JSON оформляются указанным количеством пробелов, если строкой -- вставляется эта строка. - -Например: - -```js -//+ run -var user = { - name: "Вася", - age: 25, - roles: { - isAdmin: false, - isEditor: true - } -}; - -*!* -var str = JSON.stringify(user, "", 4); -*/!* - -alert( str ); -/* Результат -- красиво сериализованный объект: -{ - "name": "Вася", - "age": 25, - "roles": { - "isAdmin": false, - "isEditor": true - } -} -*/ -``` - -## Итого - -
        -
      • JSON -- формат для представления объектов (и не только) в виде строки.
      • -
      • Методы [JSON.parse](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/parse) и [JSON.stringify](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify) позволяют интеллектуально преобразовать объект в строку и обратно.
      • -
      - - - -[head] - -[/head] \ No newline at end of file diff --git a/1-js/7-js-misc/3-settimeout-setinterval/1-output-numbers-100ms/solution.md b/1-js/7-js-misc/3-settimeout-setinterval/1-output-numbers-100ms/solution.md deleted file mode 100644 index f6e7fbcd..00000000 --- a/1-js/7-js-misc/3-settimeout-setinterval/1-output-numbers-100ms/solution.md +++ /dev/null @@ -1,17 +0,0 @@ - - -```js -//+ run -function printNumbersInterval() { - var i = 1; - var timerId = setInterval(function() { - console.log(i); - if (i == 20) clearInterval(timerId); - i++; - }, 100); -} - -// вызов -printNumbersInterval(); -``` - diff --git a/1-js/7-js-misc/3-settimeout-setinterval/1-output-numbers-100ms/task.md b/1-js/7-js-misc/3-settimeout-setinterval/1-output-numbers-100ms/task.md deleted file mode 100644 index dc2364f4..00000000 --- a/1-js/7-js-misc/3-settimeout-setinterval/1-output-numbers-100ms/task.md +++ /dev/null @@ -1,21 +0,0 @@ -# Вывод чисел каждые 100мс - -[importance 5] - -Напишите функцию `printNumbersInterval()`, которая последовательно выводит в консоль числа от 1 до 20, с интервалом между числами 100мс. То есть, весь вывод должен занимать 2000мс, в течение которых каждые 100мс в консоли появляется очередное число. - -Нажмите на кнопку, открыв консоль, для демонстрации: - - - - -P.S. Функция должна использовать `setInterval`. \ No newline at end of file diff --git a/1-js/7-js-misc/3-settimeout-setinterval/2-output-numbers-100ms-settimeout/solution.md b/1-js/7-js-misc/3-settimeout-setinterval/2-output-numbers-100ms-settimeout/solution.md deleted file mode 100644 index bc23dd04..00000000 --- a/1-js/7-js-misc/3-settimeout-setinterval/2-output-numbers-100ms-settimeout/solution.md +++ /dev/null @@ -1,17 +0,0 @@ - - -```js -//+ run -function printNumbersTimeout20_100() { - var i = 1; - var timerId = setTimeout(function go() { - console.log(i); - if (i < 20) setTimeout(go, 100); - i++; - }, 100); -} - -// вызов -printNumbersTimeout20_100(); -``` - diff --git a/1-js/7-js-misc/3-settimeout-setinterval/2-output-numbers-100ms-settimeout/task.md b/1-js/7-js-misc/3-settimeout-setinterval/2-output-numbers-100ms-settimeout/task.md deleted file mode 100644 index 8334753f..00000000 --- a/1-js/7-js-misc/3-settimeout-setinterval/2-output-numbers-100ms-settimeout/task.md +++ /dev/null @@ -1,5 +0,0 @@ -# Вывод чисел каждые 100мс, через setTimeout - -[importance 5] - -Сделайте то же самое, что в задаче [](/task/output-numbers-100ms), но с использованием рекурсивного `setTimeout` вместо `setInterval`. \ No newline at end of file diff --git a/1-js/7-js-misc/3-settimeout-setinterval/3-highlight-tactics/solution.md b/1-js/7-js-misc/3-settimeout-setinterval/3-highlight-tactics/solution.md deleted file mode 100644 index 13c70041..00000000 --- a/1-js/7-js-misc/3-settimeout-setinterval/3-highlight-tactics/solution.md +++ /dev/null @@ -1,5 +0,0 @@ -**Нужно выбрать вариант 2, который гарантирует браузеру свободное время между выполнениями `highlight`.** - -Первый вариант может загрузить процессор на 100%, если `highlight` занимает время, близкое к 10мс или, тем более, большее чем 10мс, т.к. таймер не учитывает время выполнения функции. - -Что интересно, в обоих случаях браузер не будет выводить предупреждение о том, что скрипт занимает много времени. Но от 100% загрузки процессора возможны притормаживания других операций. В общем, это совсем не то, что мы хотим, поэтому вариант 2. \ No newline at end of file diff --git a/1-js/7-js-misc/3-settimeout-setinterval/3-highlight-tactics/task.md b/1-js/7-js-misc/3-settimeout-setinterval/3-highlight-tactics/task.md deleted file mode 100644 index afe1d6fd..00000000 --- a/1-js/7-js-misc/3-settimeout-setinterval/3-highlight-tactics/task.md +++ /dev/null @@ -1,34 +0,0 @@ -# Для подсветки setInterval или setTimeout? - -[importance 5] - -Стоит задача: реализовать подсветку синтаксиса в длинном коде при помощи JavaScript, для онлайн-редактора кода. Это требует сложных вычислений, особенно загружает процессор генерация дополнительных элементов страницы, визуально осуществляющих подсветку. - -Поэтому решаем обрабатывать не весь код сразу, что привело бы к зависанию скрипта, а разбить работу на части: подсвечивать по 20 строк раз в 10мс. - -Как мы знаем, есть два варианта реализации такой подсветки: - -
        -
      1. Через `setInterval`, с остановкой по окончании работы: - -```js -timer = setInterval(function() { - if (есть еще что подсветить) highlight(); - else clearInterval(timer); -}, 10); -``` - -
      2. -
      3. Через рекурсивный `setTimeout`: - -```js -setTimeout(function go() { - highlight(); - if (есть еще что подсветить) setTimeout(go, 10); -}, 10); -``` - -
      4. -
      - -Какой из них стоит использовать? Почему? \ No newline at end of file diff --git a/1-js/7-js-misc/3-settimeout-setinterval/4-settimeout-result/solution.md b/1-js/7-js-misc/3-settimeout-setinterval/4-settimeout-result/solution.md deleted file mode 100644 index ea95474b..00000000 --- a/1-js/7-js-misc/3-settimeout-setinterval/4-settimeout-result/solution.md +++ /dev/null @@ -1,8 +0,0 @@ -Ответы: -
        -
      • `alert` выведет `100000000`.
      • -
      • **3**, срабатывание будет после окончания работы `hardWork`.
      • -
      - - -Так будет потому, что вызов планируется на `100мс` от времени вызова `setTimeout`, но функция выполняется больше, чем `100мс`, поэтому к моменту ее окончания время уже подошло и отложенный вызов выполняется тут же. \ No newline at end of file diff --git a/1-js/7-js-misc/3-settimeout-setinterval/4-settimeout-result/task.md b/1-js/7-js-misc/3-settimeout-setinterval/4-settimeout-result/task.md deleted file mode 100644 index 8c2de36d..00000000 --- a/1-js/7-js-misc/3-settimeout-setinterval/4-settimeout-result/task.md +++ /dev/null @@ -1,31 +0,0 @@ -# Что выведет setTimeout? - -[importance 5] - -В коде ниже запланирован запуск `setTimeout`, а затем запущена тяжёлая функция `hardWork`, выполнение которой занимает более долгое время, чем интервал до срабатывания таймера. - -Когда сработает `setTimeout`? Выберите нужный вариант: -
        -
      1. До выполнения `hardWork`.
      2. -
      3. Во время выполнения `hardWork`.
      4. -
      5. Сразу же по окончании `hardWork`.
      6. -
      7. Через 100мс после окончания `hardWork`.
      8. -
      - -Что выведет `alert` в коде ниже? - -```js -setTimeout(function() { - alert( i ); -}, 100); - -var i; - -function hardWork() { - // время выполнения этого кода >100мс, сам код неважен - for (i = 0; i < 1e8; i++) hardWork[i % 2] = i; -} - -hardWork(); -``` - diff --git a/1-js/7-js-misc/3-settimeout-setinterval/5-setinterval-result/solution.md b/1-js/7-js-misc/3-settimeout-setinterval/5-setinterval-result/solution.md deleted file mode 100644 index 1fe34f89..00000000 --- a/1-js/7-js-misc/3-settimeout-setinterval/5-setinterval-result/solution.md +++ /dev/null @@ -1,37 +0,0 @@ -Вызов `alert(i)` в `setTimeout` введет `100000001`. - -Можете проверить это запуском: - -```js -//+ run -var timer = setInterval(function() { - i++; -}, 10); - -setTimeout(function() { - clearInterval(timer); -*!* - alert( i ); // (*) -*/!* -}, 50); - -var i; - -function f() { - // точное время выполнения не играет роли - // здесь оно заведомо больше 100мс - for (i = 0; i < 1e8; i++) f[i % 2] = i; -} - -f(); -``` - -Правильный вариант срабатывания: **3** (сразу же по окончании `f` один раз). - -Планирование `setInterval` будет вызывать функцию каждые `10мс` после текущего времени. Но так как интерпретатор занят долгой функцией, то до конца ее работы никакого вызова не происходит. - -За время выполнения `f` может пройти время, на которое запланированы несколько вызовов `setInterval`, но в этом случае остается только один, т.е. накопления вызовов не происходит. Такова логика работы `setInterval`. - -После окончания текущего скрипта интерпретатор обращается к очереди запланированных вызовов, видит в ней `setInterval` и выполняет. А затем тут же выполняется `setTimeout`, очередь которого тут же подошла. - -Итого, как раз и видим, что `setInterval` выполнился ровно 1 раз по окончании работы функции. Такое поведение кросс-браузерно. \ No newline at end of file diff --git a/1-js/7-js-misc/3-settimeout-setinterval/5-setinterval-result/task.md b/1-js/7-js-misc/3-settimeout-setinterval/5-setinterval-result/task.md deleted file mode 100644 index 84461c2d..00000000 --- a/1-js/7-js-misc/3-settimeout-setinterval/5-setinterval-result/task.md +++ /dev/null @@ -1,44 +0,0 @@ -# Что выведет после setInterval? - -[importance 5] - -В коде ниже запускается `setInterval` каждые 10мс, и через 50мс запланирована его отмена. - -После этого запущена тяжёлая функция `f`, выполнение которой (мы точно знаем) потребует более 100мс. - -Сработает ли `setInterval`, как и когда? - -Варианты: -
        -
      1. Да, несколько раз, *в процессе* выполнения `f`.
      2. -
      3. Да, несколько раз, *сразу после* выполнения `f`.
      4. -
      5. Да, один раз, *сразу после* выполнения `f`.
      6. -
      7. Нет, не сработает.
      8. -
      9. Может быть по-разному, как повезёт.
      10. -
      - -Что выведет `alert` в строке `(*)`? - -```js -var i; -var timer = setInterval(function() { // планируем setInterval каждые 10мс - i++; -}, 10); - -setTimeout(function() { // через 50мс - отмена setInterval - clearInterval(timer); -*!* - alert( i ); // (*) -*/!* -}, 50); - -// и запускаем тяжёлую функцию -function f() { - // точное время выполнения не играет роли - // здесь оно заведомо больше 100мс - for (i = 0; i < 1e8; i++) f[i % 2] = i; -} - -f(); -``` - diff --git a/1-js/7-js-misc/3-settimeout-setinterval/6-who-runs-faster/solution.md b/1-js/7-js-misc/3-settimeout-setinterval/6-who-runs-faster/solution.md deleted file mode 100644 index 9d8afe0d..00000000 --- a/1-js/7-js-misc/3-settimeout-setinterval/6-who-runs-faster/solution.md +++ /dev/null @@ -1,55 +0,0 @@ -Задача -- с небольшим "нюансом". - -Есть браузеры, в которых на время работы JavaScript таймер "застывает", например таков IE. В них количество шагов будет почти одинаковым, +-1. - -В других браузерах (Chrome) первый бегун будет быстрее. - -Создадим реальные объекты `Runner` и запустим их для проверки: - -```js -//+ run -function Runner() { - this.steps = 0; - - this.step = function() { - this.doSomethingHeavy(); - this.steps++; - }; - - function fib(n) { - return n <= 1 ? n : fib(n - 1) + fib(n - 2); - } - - this.doSomethingHeavy = function() { - for (var i = 0; i < 25; i++) { - this[i] = fib(i); - } - }; - -} - -var runner1 = new Runner(); -var runner2 = new Runner(); - -// запускаем бегунов -var t1 = setInterval(function() { - runner1.step(); -}, 15); - -var t2 = setTimeout(function go() { - runner2.step(); - t2 = setTimeout(go, 15); -}, 15); - -// кто сделает больше шагов? -setTimeout(function() { - clearInterval(t1); - clearTimeout(t2); - alert( runner1.steps ); - alert( runner2.steps ); -}, 5000); -``` - -Если бы в шаге `step()` не было вызова `doSomethingHeavy()`, то есть он бы не требовал времени, то количество шагов было бы почти равным. - -Но так как у нас шаг, всё же, что-то делает, и функция `doSomethingHeavy()` специально написана таким образом, что она требует (небольшого) времени, то первый бегун успеет сделать больше шагов. Ведь в `setTimeout` пауза `15` мс будет *между* шагами, а `setInterval` шагает равномерно, каждые `15` мс. Получается чаще. \ No newline at end of file diff --git a/1-js/7-js-misc/3-settimeout-setinterval/6-who-runs-faster/task.md b/1-js/7-js-misc/3-settimeout-setinterval/6-who-runs-faster/task.md deleted file mode 100644 index 85d20a37..00000000 --- a/1-js/7-js-misc/3-settimeout-setinterval/6-who-runs-faster/task.md +++ /dev/null @@ -1,35 +0,0 @@ -# Кто быстрее? - -[importance 5] - -Есть два бегуна: - -```js -var runner1 = new Runner(); -var runner2 = new Runner(); -``` - -У каждого есть метод `step()`, который делает шаг, увеличивая свойство `steps`. - -Конкретный код метода `step()` не имеет значения, важно лишь что шаг делается не мгновенно, он требует небольшого времени. - -Если запустить первого бегуна через `setInterval`, а второго -- через вложенный `setTimeout` -- какой сделает больше шагов за 5 секунд? - -```js -// первый? -setInterval(function() { - runner1.step(); -}, 15); - -// или второй? -setTimeout(function go() { - runner2.step(); - setTimeout(go, 15); -}, 15); - -setTimeout(function() { - alert( runner1.steps ); - alert( runner2.steps ); -}, 5000); -``` - diff --git a/1-js/7-js-misc/3-settimeout-setinterval/7-delay/_js.view/solution.js b/1-js/7-js-misc/3-settimeout-setinterval/7-delay/_js.view/solution.js deleted file mode 100644 index 62271941..00000000 --- a/1-js/7-js-misc/3-settimeout-setinterval/7-delay/_js.view/solution.js +++ /dev/null @@ -1,12 +0,0 @@ -function delay(f, ms) { - - return function() { - var savedThis = this; - var savedArgs = arguments; - - setTimeout(function() { - f.apply(savedThis, savedArgs); - }, ms); - }; - -} \ No newline at end of file diff --git a/1-js/7-js-misc/3-settimeout-setinterval/7-delay/_js.view/test.js b/1-js/7-js-misc/3-settimeout-setinterval/7-delay/_js.view/test.js deleted file mode 100644 index 964ccf60..00000000 --- a/1-js/7-js-misc/3-settimeout-setinterval/7-delay/_js.view/test.js +++ /dev/null @@ -1,46 +0,0 @@ -describe("delay", function() { - before(function() { - this.clock = sinon.useFakeTimers(); - }); - - after(function() { - this.clock.restore(); - }); - - it("вызывает функцию через указанный таймаут", function() { - var start = Date.now(); - - function f(x) { - assert.equal(Date.now() - start, 1000); - } - f = sinon.spy(f); - - var f1000 = delay(f, 1000); - f1000("test"); - this.clock.tick(2000); - assert(f.calledOnce, 'calledOnce check fails'); - }); - - it("передаёт аргументы и контекст", function() { - var start = Date.now(); - var user = { - sayHi: function(phrase, who) { - assert.equal(this, user); - assert.equal(phrase, "Привет"); - assert.equal(who, "Вася"); - assert.equal(Date.now() - start, 1500); - } - }; - - user.sayHi = sinon.spy(user.sayHi); - - var spy = user.sayHi; - user.sayHi = delay(user.sayHi, 1500); - - user.sayHi("Привет", "Вася"); - - this.clock.tick(2000); - - assert(spy.calledOnce, 'проверка calledOnce не сработала'); - }); -}); \ No newline at end of file diff --git a/1-js/7-js-misc/3-settimeout-setinterval/7-delay/solution.md b/1-js/7-js-misc/3-settimeout-setinterval/7-delay/solution.md deleted file mode 100644 index 2044ff9b..00000000 --- a/1-js/7-js-misc/3-settimeout-setinterval/7-delay/solution.md +++ /dev/null @@ -1,46 +0,0 @@ - - -```js -//+ run -function delay(f, ms) { - -*!* - return function() { - var savedThis = this; - var savedArgs = arguments; - - setTimeout(function() { - f.apply(savedThis, savedArgs); - }, ms); - }; -*/!* - -} - -function f(x) { - alert( x ); -} - -var f1000 = delay(f, 1000); -var f1500 = delay(f, 1500); - -f1000("тест"); // выведет "тест" через 1000 миллисекунд -f1500("тест2"); // выведет "тест2" через 1500 миллисекунд -``` - -Обратим внимание на то, как работает обёртка: - -```js -return function() { - var savedThis = this; - var savedArgs = arguments; - - setTimeout(function() { - f.apply(savedThis, savedArgs); - }, ms); -}; -``` - -Именно обёртка возвращается декоратором `delay` и будет вызвана. Чтобы передать аргумент и контекст функции, вызываемой через `ms` миллисекунд, они копируются в локальные переменные `savedThis` и `savedArgs`. - -Это один из самых простых, и в то же время удобных способов передать что-либо в функцию, вызываемую через `setTimeout`. \ No newline at end of file diff --git a/1-js/7-js-misc/3-settimeout-setinterval/7-delay/task.md b/1-js/7-js-misc/3-settimeout-setinterval/7-delay/task.md deleted file mode 100644 index f198d7b9..00000000 --- a/1-js/7-js-misc/3-settimeout-setinterval/7-delay/task.md +++ /dev/null @@ -1,23 +0,0 @@ -# Функция-задержка - -[importance 5] - -Напишите функцию `delay(f, ms)`, которая возвращает обёртку вокруг `f`, задерживающую вызов на `ms` миллисекунд. - -Например: - -```js -function f(x) { - alert( x ); -} - -var f1000 = delay(f, 1000); -var f1500 = delay(f, 1500); - -f1000("тест"); // выведет "тест" через 1000 миллисекунд -f1500("тест2"); // выведет "тест2" через 1500 миллисекунд -``` - -Упрощённо можно сказать, что `delay` возвращает "задержанный на `ms`" вариант `f`. - -В примере выше у функции только один аргумент, но `delay` должна быть универсальной: передавать любое количество аргументов и контекст `this`. \ No newline at end of file diff --git a/1-js/7-js-misc/3-settimeout-setinterval/8-debounce/_js.view/solution.js b/1-js/7-js-misc/3-settimeout-setinterval/8-debounce/_js.view/solution.js deleted file mode 100644 index e52efb87..00000000 --- a/1-js/7-js-misc/3-settimeout-setinterval/8-debounce/_js.view/solution.js +++ /dev/null @@ -1,19 +0,0 @@ -function debounce(f, ms) { - - var state = null; - - var COOLDOWN = 1; - - return function() { - if (state) return; - - f.apply(this, arguments); - - state = COOLDOWN; - - setTimeout(function() { - state = null - }, ms); - } - -} \ No newline at end of file diff --git a/1-js/7-js-misc/3-settimeout-setinterval/8-debounce/_js.view/test.js b/1-js/7-js-misc/3-settimeout-setinterval/8-debounce/_js.view/test.js deleted file mode 100644 index 860cd6dd..00000000 --- a/1-js/7-js-misc/3-settimeout-setinterval/8-debounce/_js.view/test.js +++ /dev/null @@ -1,47 +0,0 @@ -describe("debounce", function() { - before(function() { - this.clock = sinon.useFakeTimers(); - }); - - after(function() { - this.clock.restore(); - }); - - it("вызывает функцию не чаще чем раз в ms миллисекунд", function() { - var log = ''; - - function f(a) { - log += a; - } - - f = debounce(f, 1000); - - f(1); // выполнится сразу же - f(2); // игнор - - setTimeout(function() { - f(3) - }, 100); // игнор (рановато) - setTimeout(function() { - f(4) - }, 1100); // выполнится (таймаут прошёл) - setTimeout(function() { - f(5) - }, 1500); // игнор - - this.clock.tick(5000); - assert.equal(log, "14"); - }); - - it("сохраняет контекст вызова", function() { - var obj = { - f: function() { - assert.equal(this, obj); - } - }; - - obj.f = debounce(obj.f, 1000); - obj.f("test"); - }); - -}); \ No newline at end of file diff --git a/1-js/7-js-misc/3-settimeout-setinterval/8-debounce/solution.md b/1-js/7-js-misc/3-settimeout-setinterval/8-debounce/solution.md deleted file mode 100644 index d5fc55e1..00000000 --- a/1-js/7-js-misc/3-settimeout-setinterval/8-debounce/solution.md +++ /dev/null @@ -1,38 +0,0 @@ - - -```js -//+ run no-beautify -function debounce(f, ms) { - - var state = null; - - var COOLDOWN = 1; - - return function() { - if (state) return; - - f.apply(this, arguments); - - state = COOLDOWN; - - setTimeout(function() { state = null }, ms); - } - -} - -function f(x) { alert(x) } -var f = debounce(f, 1000); - -f(1); // 1, выполнится сразу же -f(2); // игнор - -setTimeout( function() { f(3) }, 100); // игнор (прошло только 100мс) -setTimeout( function() { f(4) }, 1100); // 4, выполнится -setTimeout( function() { f(5) }, 1500); // игнор -``` - -Вызов `debounce` возвращает функцию-обёртку. Все необходимые данные для неё хранятся в замыкании. - -При вызове ставится таймер и состояние `state` меняется на константу `COOLDOWN` ("в процессе охлаждения"). - -Последующие вызовы игнорируются, пока таймер не обнулит состояние. \ No newline at end of file diff --git a/1-js/7-js-misc/3-settimeout-setinterval/8-debounce/task.md b/1-js/7-js-misc/3-settimeout-setinterval/8-debounce/task.md deleted file mode 100644 index 31b9f540..00000000 --- a/1-js/7-js-misc/3-settimeout-setinterval/8-debounce/task.md +++ /dev/null @@ -1,25 +0,0 @@ -# Вызов не чаще чем в N миллисекунд - -[importance 5] - -Напишите функцию `debounce(f, ms)`, которая возвращает обёртку, которая передаёт вызов `f` не чаще, чем раз в `ms` миллисекунд. - -"Лишние" вызовы игнорируются. Все аргументы и контекст -- передаются. - -Например: - -```js -//+ no-beautify -function f() { ... } - -var f = debounce(f, 1000); - -f(1); // выполнится сразу же -f(2); // игнор - -setTimeout( function() { f(3) }, 100); // игнор (прошло только 100мс) -setTimeout( function() { f(4) }, 1100); // выполнится -setTimeout( function() { f(5) }, 1500); // игнор -``` - -Упрощённо можно сказать, что `debounce` возвращает вариант `f`, срабатывающий не чаще чем раз в `ms` миллисекунд. \ No newline at end of file diff --git a/1-js/7-js-misc/3-settimeout-setinterval/9-throttle/_js.view/solution.js b/1-js/7-js-misc/3-settimeout-setinterval/9-throttle/_js.view/solution.js deleted file mode 100644 index a8011c6b..00000000 --- a/1-js/7-js-misc/3-settimeout-setinterval/9-throttle/_js.view/solution.js +++ /dev/null @@ -1,29 +0,0 @@ -function throttle(func, ms) { - - var isThrottled = false, - savedArgs, - savedThis; - - function wrapper() { - - if (isThrottled) { - savedArgs = arguments; - savedThis = this; - return; - } - - func.apply(this, arguments); - - isThrottled = true; - - setTimeout(function() { - isThrottled = false; - if (savedArgs) { - wrapper.apply(savedThis, savedArgs); - savedArgs = savedThis = null; - } - }, ms); - } - - return wrapper; -} \ No newline at end of file diff --git a/1-js/7-js-misc/3-settimeout-setinterval/9-throttle/_js.view/test.js b/1-js/7-js-misc/3-settimeout-setinterval/9-throttle/_js.view/test.js deleted file mode 100644 index 1627e857..00000000 --- a/1-js/7-js-misc/3-settimeout-setinterval/9-throttle/_js.view/test.js +++ /dev/null @@ -1,47 +0,0 @@ -describe("throttle(f, 1000)", function() { - var f1000; - var log = ""; - - function f(a) { - log += a; - } - - before(function() { - f1000 = throttle(f, 1000); - this.clock = sinon.useFakeTimers(); - }); - - it("первый вызов срабатывает тут же", function() { - f1000(1); // такой вызов должен сработать тут же - assert.equal(log, "1"); - }); - - it("тормозит второе срабатывание до 1000мс", function() { - f1000(2); // (тормозим, не прошло 1000мс) - f1000(3); // (тормозим, не прошло 1000мс) - // через 1000 мс запланирован вызов с последним аргументом - - assert.equal(log, "1"); // пока что сработал только первый вызов - - this.clock.tick(1000); // прошло 1000мс времени - assert.equal(log, "13"); // log==13, т.к. сработал вызов f1000(3) - }); - - it("тормозит третье срабатывание до 1000мс после второго", function() { - this.clock.tick(100); - f1000(4); // (тормозим, с последнего вызова прошло 100мс - менее 1000мс) - this.clock.tick(100); - f1000(5); // (тормозим, с последнего вызова прошло 200мс - менее 1000мс) - this.clock.tick(700); - f1000(6); // (тормозим, с последнего вызова прошло 900мс - менее 1000мс) - - this.clock.tick(100); // сработал вызов с 6 - - assert.equal(log, "136"); - }); - - after(function() { - this.clock.restore(); - }); - -}); \ No newline at end of file diff --git a/1-js/7-js-misc/3-settimeout-setinterval/9-throttle/solution.md b/1-js/7-js-misc/3-settimeout-setinterval/9-throttle/solution.md deleted file mode 100644 index 306f2977..00000000 --- a/1-js/7-js-misc/3-settimeout-setinterval/9-throttle/solution.md +++ /dev/null @@ -1,42 +0,0 @@ - - -```js -function throttle(func, ms) { - - var isThrottled = false, - savedArgs, - savedThis; - - function wrapper() { - - if (isThrottled) { // (2) - savedArgs = arguments; - savedThis = this; - return; - } - - func.apply(this, arguments); // (1) - - isThrottled = true; - - setTimeout(function() { - isThrottled = false; // (3) - if (savedArgs) { - wrapper.apply(savedThis, savedArgs); - savedArgs = savedThis = null; - } - }, ms); - } - - return wrapper; -} -``` - -Шаги работы этой функции: -
        -
      1. Декоратор `throttle` возвращает функцию-обёртку `wrapper`, которая при первом вызове запускает `func` и переходит в состояние "паузы" (`isThrottled = true`).
      2. -
      3. В этом состоянии все новые вызовы запоминаются в замыкании через `savedArgs/savedThis`. Обратим внимание, что и контекст вызова и аргументы для нас одинаково важны и запоминаются одновременно. Только зная и то и другое, можно воспроизвести вызов правильно.
      4. -
      5. Далее, когда пройдёт таймаут `ms` миллисекунд -- пауза будет снята, а `wrapper` -- запущен с последними аргументами и контекстом (если во время паузы были вызовы).
      6. -
      - -Шаг `(3)` запускает именно не саму функцию, а снова `wrapper`, так как необходимо не только выполнить `func`, но и снова поставить выполнение на паузу. Получается последовательность "вызов - пауза.. вызов - пауза .. вызов - пауза ...", каждое выполнение в обязательном порядке сопровождается паузой после него. Это удобно описывается рекурсией. diff --git a/1-js/7-js-misc/3-settimeout-setinterval/9-throttle/task.md b/1-js/7-js-misc/3-settimeout-setinterval/9-throttle/task.md deleted file mode 100644 index aaf5956b..00000000 --- a/1-js/7-js-misc/3-settimeout-setinterval/9-throttle/task.md +++ /dev/null @@ -1,52 +0,0 @@ -# Тормозилка - -[importance 5] - -Напишите функцию `throttle(f, ms)` -- "тормозилку", которая возвращает обёртку, передающую вызов `f` не чаще, чем раз в `ms` миллисекунд. - -**У этой функции должно быть важное существенное отличие от `debounce`:** если игнорируемый вызов оказался последним, т.е. после него до окончания задержки ничего нет -- то он выполнится. - -Чтобы лучше понять, откуда взялось это требование, и как `throttle` должна работать -- разберём реальное применение, на которое и ориентирована эта задача. - -**Например, нужно обрабатывать передвижения мыши.** - -В JavaScript это делается функцией, которая будет запускаться при каждом микро-передвижении мыши и получать координаты курсора. По мере того, как мышь двигается, эта функция может запускаться очень часто, может быть 100 раз в секунду (каждые 10мс). - -**Функция обработки передвижения должна обновлять некую информацию на странице.** - -При этом обновление -- слишком "тяжёлый" процесс, чтобы делать его при каждом микро-передвижении. Имеет смысл делать его раз в 100мс, не чаще. - -Пусть функция, которая осуществляет это обновление по передвижению, называется `onmousemove`. - -Вызов `throttle(onmousemove, 100)`, по сути, предназначен для того, чтобы "притормаживать" обработку `onmousemove`. Технически, он должен возвращать обёртку, которая передаёт все вызовы `onmousemove`, но не чаще чем раз в 100мс. - -**При этом промежуточные движения можно игнорировать, но мышь в конце концов где-то остановится. И это последнее, итоговое положение мыши обязательно нужно обработать!** - -Визуально это даст следующую картину обработки перемещений мыши: -
        -
      1. Первое обновление произойдёт сразу (это важно, посетитель тут же видит реакцию на своё действие).
      2. -
      3. Дальше может быть много вызовов (микро-передвижений) с разными координатами, но пока не пройдёт 100мс -- ничего не будет.
      4. -
      5. По истечении 100мс -- опять обновление, с последними координатами. Промежуточные микро-передвижения игнорированы.
      6. -
      7. В конце концов мышь где-то остановится, обновление по окончании очередной паузы 100мс сработает с последними координатами.
      8. -
      - -Ещё раз заметим -- задача из реальной жизни, и в ней принципиально важно, что *последнее* передвижение обрабатывается. Пользователь должен увидеть, где остановил мышь. - -Пример использования: - -```js -var f = function(a) { - console.log(a) -}; - -// затормозить функцию до одного раза в 1000 мс -var f1000 = throttle(f, 1000); - -f1000(1); // выведет 1 -f1000(2); // (тормозим, не прошло 1000мс) -f1000(3); // (тормозим, не прошло 1000мс) - -// когда пройдёт 1000мс... -// выведет 3, промежуточное значение 2 игнорируется -``` - diff --git a/1-js/7-js-misc/3-settimeout-setinterval/article.md b/1-js/7-js-misc/3-settimeout-setinterval/article.md deleted file mode 100644 index a85c0550..00000000 --- a/1-js/7-js-misc/3-settimeout-setinterval/article.md +++ /dev/null @@ -1,326 +0,0 @@ -# setTimeout и setInterval - -Почти все реализации JavaScript имеют внутренний таймер-планировщик, который позволяет задавать вызов функции через заданный период времени. - -В частности, эта возможность поддерживается в браузерах и в сервере Node.JS. - -[cut] -## setTimeout - -Синтаксис: - -```js -var timerId = setTimeout(func / code, delay[, arg1, arg2...]) -``` - -Параметры: - -
      -
      `func/code`
      -
      Функция или строка кода для исполнения. -Строка поддерживается для совместимости, использовать её не рекомендуется.
      -
      `delay`
      -
      Задержка в милисекундах, 1000 милисекунд равны 1 секунде.
      -
      `arg1`, `arg2`...
      -
      Аргументы, которые нужно передать функции. Не поддерживаются в IE9-.
      -
      - -Исполнение функции произойдёт спустя время, указанное в параметре `delay`. - -Например, следующий код вызовет `func()` через одну секунду: - -```js -//+ run -function func() { - alert( 'Привет' ); -} - -*!* -setTimeout(func, 1000); -*/!* -``` - -С передачей аргументов (не сработает в IE9-): - -```js -//+ run -function func(phrase, who) { - alert( phrase + ', ' + who ); -} - -*!* -setTimeout(func, 1000, "Привет", "Вася"); // Привет, Вася -*/!* -``` - -Если первый аргумент является строкой, то интерпретатор создаёт анонимную функцию из этой строки. - -То есть такая запись тоже сработает: - -```js -//+ run no-beautify -setTimeout("alert('Привет')", 1000); -``` - -Однако, использование строк не рекомендуется, так как они могут вызвать проблемы при минимизации кода, и, вообще, сама возможность использовать строку сохраняется лишь для совместимости. - -Вместо них используйте анонимные функции, вот так: - -```js -//+ run no-beautify -setTimeout(function() { alert('Привет') }, 1000); -``` - -### Отмена исполнения clearTimeout - -Функция `setTimeout` возвращает числовой идентификатор таймера `timerId`, который можно использовать для отмены действия. - -Синтаксис: - -```js -var timerId = setTimeout(...); -clearTimeout(timerId); -``` - -В следующем примере мы ставим таймаут, а затем удаляем (передумали). В результате ничего не происходит. - -```js -//+ run no-beautify -var timerId = setTimeout(function() { alert(1) }, 1000); -alert(timerId); // число - идентификатор таймера - -clearTimeout(timerId); -alert(timerId); // всё ещё число, оно не обнуляется после отмены -``` - -Как видно из `alert`, в браузере идентификатор таймера является обычным числом. Другие JavaScript-окружения, например Node.JS, могут возвращать объект таймера, с дополнительными методами. - -**Такие разночтения вполне соответствуют стандарту просто потому, что в спецификации JavaScript про таймеры нет ни слова.** - -Таймеры -- это надстройка над JavaScript, которая описана в [секции Timers](http://www.w3.org/TR/html5/webappapis.html#timers) стандарта HTML5 для браузеров и в [документации к Node.JS](http://nodejs.org/docs/latest/api/timers.html) -- для сервера. - -## setInterval - -Метод `setInterval` имеет синтаксис, аналогичный `setTimeout`. - -```js -var timerId = setInterval(func / code, delay[, arg1, arg2...]) -``` - -Смысл аргументов -- тот же самый. Но, в отличие от `setTimeout`, он запускает выполнение функции не один раз, а регулярно повторяет её через указанный интервал времени. Остановить исполнение можно вызовом `clearInterval(timerId)`. - -Следующий пример при запуске станет выводить сообщение каждые две секунды, пока не пройдёт 5 секунд: - -```js -//+ run -// начать повторы с интервалом 2 сек -var timerId = setInterval(function() { - alert( "тик" ); -}, 2000); - -// через 5 сек остановить повторы -setTimeout(function() { - clearInterval(timerId); - alert( 'стоп' ); -}, 5000); -``` - -[smart header="Модальные окна замораживают время в Chrome/Opera/Safari"] -Что будет, если долго не жать `OK` на появившемся `alert`? Это зависит от браузера. - -В браузерах Chrome, Opera и Safari внутренний таймер "заморожен" во время показа `alert/confirm/prompt`. А вот в IE и Firefox внутренний таймер продолжит идти. - -Поэтому, если закрыть `alert` после небольшой паузы, то в Firefox/IE следующий `alert` будет показан сразу же (время подошло), а в Chrome/Opera/Safari -- только через 2 секунды после закрытия. -[/smart] - - -### Рекурсивный setTimeout - -Важная альтернатива `setInterval` -- рекурсивный `setTimeout`: - -```js -/** вместо: -var timerId = setInterval(function() { - alert( "тик" ); -}, 2000); -*/ - -var timerId = setTimeout(function tick() { - alert( "тик" ); -*!* - timerId = setTimeout(tick, 2000); -*/!* -}, 2000); -``` - -В коде выше следующее выполнение планируется сразу после окончания предыдущего. - -**Рекурсивный `setTimeout` -- более гибкий метод тайминга, чем `setInterval`, так как время до следующего выполнения можно запланировать по-разному, в зависимости от результатов текущего.** - -Например, у нас есть сервис, который в 5 секунд опрашивает сервер на предмет новых данных. В случае, если сервер перегружен, можно увеличивать интервал опроса до 10, 20, 60 секунд... А потом вернуть обратно, когда всё нормализуется. - -Если у нас регулярно проходят грузящие процессор задачи, то мы можем оценивать время, потраченное на их выполнение, и планировать следующий запуск раньше или позже. - -**Рекурсивный `setTimeout` гарантирует паузу между вызовами, `setInterval` -- нет.** - -Давайте сравним два кода. Первый использует `setInterval`: - -```js -var i = 1; -setInterval(function() { - func(i); -}, 100); -``` - -Второй использует рекурсивный `setTimeout`: - -```js -var i = 1; -setTimeout(function run() { - func(i); - setTimeout(run, 100); -}, 100); -``` - -При `setInterval` внутренний таймер будет срабатывать чётко каждые `100` мс и вызывать `func(i)`: - - - -Вы обратили внимание?... - -**Реальная пауза между вызовами `func` при `setInterval` меньше, чем указана в коде!** - -Это естественно, ведь время работы функции никак не учитывается, оно "съедает" часть интервала. - -Возможно и такое что `func` оказалась сложнее, чем мы рассчитывали и выполнялась дольше, чем 100мс. - -В этом случае интерпретатор будет ждать, пока функция завершится, затем проверит таймер и, если время вызова `setInterval` уже подошло (или прошло), то следующий вызов произойдёт *сразу же*. - -**Если функция и выполняется дольше, чем пауза `setInterval`, то вызовы будут происходить вообще без перерыва.** - -Исключением является IE, в котором таймер "застывает" во время выполнения JavaScript. - -А так будет выглядеть картинка с рекурсивным `setTimeout`: - - - -**При рекурсивном `setTimeout` задержка всегда фиксирована и равна 100мс.** - -Это происходит потому, что каждый новый запуск планируется только после окончания текущего. - -[smart header="Управление памятью"] -Сборщик мусора в JavaScript не чистит функции, назначенные в таймерах, пока таймеры актуальны. - -При передаче функции в `setInterval/setTimeout` создаётся внутренняя ссылка на неё, через которую браузер её будет запускать, и которая препятствует удалению из памяти, даже если функция анонимна. - -```js -// Функция будет жить в памяти, пока не сработал (или не был очищен) таймер -setTimeout(function() {}, 100); -``` - -
        -
      • Для `setTimeout` -- внутренняя ссылка исчезнет после исполнения функции.
      • -
      • Для `setInterval` -- ссылка исчезнет при очистке таймера.
      • -
      - -Так как функция также тянет за собой всё замыкание, то ставшие неактуальными, но не отменённые `setInterval` могут приводить к излишним тратам памяти. -[/smart] - - -## Минимальная задержка таймера - -У браузерного таймера есть минимальная возможная задержка. Она меняется от примерно нуля до 4мс в современных браузерах. В более старых она может быть больше и достигать 15мс. - -По [стандарту](http://www.w3.org/TR/html5/webappapis.html#timers), минимальная задержка составляет 4мс. Так что нет разницы между `setTimeout(..,1)` и `setTimeout(..,4)`. - -Посмотреть минимальное разрешение "вживую" можно на следующем примере. - -**В примере ниже каждая полоска удлиняется вызовом `setInterval` с указанной на ней задержкой -- от 0мс (сверху) до 20мс (внизу).** - -Позапускайте его в различных браузерах. Вы заметите, что несколько первых полосок анимируются с одинаковой скоростью. Это как раз потому, что слишком маленькие задержки таймер не различает. - -[iframe border="1" src="setinterval-anim" link edit] - -[warn] -В Internet Explorer, нулевая задержка `setInterval(.., 0)` не сработает. Это касается именно `setInterval`, т.е. `setTimeout(.., 0)` работает нормально. -[/warn] - -[smart header="Откуда взялись эти 4мс?"] -Почему минимальная задержка -- 4мс, а не 1мс? Зачем она вообще существует? - -Это -- "привет" от прошлого. Браузер Chrome как-то пытался убрать минимальную задержку в своих ранних версиях, но оказалось, что существуют сайты, которые используют `setTimeout(..,0)` рекурсивно, создавая тем самым "асинхронный цикл". И, если задержку совсем убрать, то будет 100% загрузка процессора, такой сайт "подвесит" браузер. - -Поэтому, чтобы не ломать существующие скрипты, решили сделать задержку. По возможности, небольшую. На время создания стандарта оптимальным числом показалось 4мс. -[/smart] - -## Реальная частота срабатывания - -В ряде ситуаций таймер будет срабатывать реже, чем обычно. Задержка между вызовами `setInterval(..., 4)` может быть не 4мс, а 30мс или даже 1000мс. - -
        -
      • Большинство браузеров (десктопных в первую очередь) продолжают выполнять `setTimeout/setInterval`, даже если вкладка неактивна. - -При этом ряд из них (Chrome, FF, IE10) снижают минимальную частоту таймера, до 1 раза в секунду. Получается, что в "фоновой" вкладке будет срабатывать таймер, но редко.
      • -
      • При работе от батареи, в ноутбуке -- браузеры тоже могут снижать частоту, чтобы реже выполнять код и экономить заряд батареи. Особенно этим известен IE. Снижение может достигать нескольких раз, в зависимости от настроек.
      • -
      • При слишком большой загрузке процессора JavaScript может не успевать обрабатывать таймеры вовремя. При этом некоторые запуски `setInterval` будут пропущены.
      • -
      - -**Вывод: на частоту 4мс стоит ориентироваться, но не стоит рассчитывать.** - -[online] -Посмотрим снижение частоты в действии на небольшом примере. - - -При клике на кнопку ниже запускается `setInterval(..., 90)`, который выводит список интервалов времени между 25 последними срабатываниями таймера. Запустите его. Перейдите на другую вкладку и вернитесь. - -
      - - - - - - -Если ваш браузер увеличивает таймаут при фоновом выполнении вкладки, то вы увидите увеличенные интервалы, помеченные красным. - -Кроме того, вы заметите, что таймер не является идеально точным ;) -[/online] - -## Разбивка долгих скриптов - -Нулевой или небольшой таймаут также используют, чтобы разорвать поток выполнения "тяжелых" скриптов. - -Например, скрипт для подсветки синтаксиса должен проанализировать код, создать много цветных элементов для подсветки и добавить их в документ -- на большом файле это займёт много времени, браузер может даже подвиснуть, что неприемлемо. - -Для того, чтобы этого избежать, сложная задача разбивается на части, выполнение каждой части запускается через мини-интервал после предыдущей, чтобы дать браузеру время. - -Например, осуществляется анализ и подсветка первых 100 строк, затем через 20 мс -- следующие 100 строк и так далее. При этом можно подстраиваться под CPU посетителя: замерять время на анализ 100 строк и, если процессор хороший, то в следующий раз обработать 200 строк, а если плохой -- то 50. В итоге подсветка будет работать с адекватной быстротой и без тормозов на любых текстах и компьютерах. - -## Итого - -
        -
      • Методы `setInterval(func, delay)` и `setTimeout(func, delay)` позволяют запускать `func` регулярно/один раз через `delay` миллисекунд.
      • -
      • Оба метода возвращают идентификатор таймера. Его используют для остановки выполнения вызовом `clearInterval/clearTimeout`.
      • -
      • В случаях, когда нужно гарантировать задержку между регулярными вызовами или гибко её менять, вместо `setInterval` используют рекурсивный `setTimeout`.
      • -
      • Минимальная задержка по стандарту составляет `4мс`. Браузеры соблюдают этот стандарт, но некоторые другие среды для выполнения JS, например Node.JS, могут предоставить и меньше задержки.
      • -
      • В реальности срабатывания таймера могут быть гораздо реже, чем назначено, например если процессор перегружен, вкладка находится в фоновом режиме, ноутбук работает от батареи или по какой-то иной причине.
      • - -Браузерных особенностей почти нет, разве что вызов `setInterval(..., 0)` с нулевой задержкой в IE недопустим, нужно указывать `setInterval(..., 1)`. - - - - - diff --git a/1-js/7-js-misc/3-settimeout-setinterval/setinterval-anim.view/index.html b/1-js/7-js-misc/3-settimeout-setinterval/setinterval-anim.view/index.html deleted file mode 100644 index caa33217..00000000 --- a/1-js/7-js-misc/3-settimeout-setinterval/setinterval-anim.view/index.html +++ /dev/null @@ -1,59 +0,0 @@ - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/1-js/7-js-misc/3-settimeout-setinterval/setinterval-interval.png b/1-js/7-js-misc/3-settimeout-setinterval/setinterval-interval.png deleted file mode 100644 index 0a815bdb3349156e208528dd2dbaf752ac83af7b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8216 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 NC#Cc_|Kamj{{x@q%C!Ih diff --git a/1-js/7-js-misc/3-settimeout-setinterval/settimeout-interval.png b/1-js/7-js-misc/3-settimeout-setinterval/settimeout-interval.png deleted file mode 100644 index b6909cc22c7bf69f18a494a8bd04a2874bb8ee45..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8049 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 Z5UZ{IXM1T3_=k=rFQXz|A@x4+e*k`&OaTA@ diff --git a/1-js/7-js-misc/3-settimeout-setinterval/settimeout-interval@2x.png b/1-js/7-js-misc/3-settimeout-setinterval/settimeout-interval@2x.png deleted file mode 100644 index 657ec0db52d8412a58f6051678f60a30828a0c40..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20113 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 WtvqKQ_{JQD@?G^ig|{ER{67GMBhd8# diff --git a/1-js/7-js-misc/4-eval/1-eval-calculator/solution.md b/1-js/7-js-misc/4-eval/1-eval-calculator/solution.md deleted file mode 100644 index 0ad14328..00000000 --- a/1-js/7-js-misc/4-eval/1-eval-calculator/solution.md +++ /dev/null @@ -1,12 +0,0 @@ -Вычислить любое выражение нам поможет `eval`: - -```js -//+ demo run -var expr = prompt("Введите выражение?", '2*3+2'); - -alert( eval(expr) ); -``` - -При этом посетитель потенциально может делать все, что угодно. - -Чтобы ограничить выражения только математикой, вводимую строку нужно проверять при помощи [регулярных выражений](/regular-expressions-javascript) на наличие любых символов, кроме букв, пробелов и знаков пунктуации. diff --git a/1-js/7-js-misc/4-eval/1-eval-calculator/task.md b/1-js/7-js-misc/4-eval/1-eval-calculator/task.md deleted file mode 100644 index 771b005f..00000000 --- a/1-js/7-js-misc/4-eval/1-eval-calculator/task.md +++ /dev/null @@ -1,9 +0,0 @@ -# Eval-калькулятор - -[importance 4] - -Напишите интерфейс, который принимает математическое выражение (`prompt`) и возвращает его результат. - -Проверять выражение на корректность не требуется. - -[demo /] diff --git a/1-js/7-js-misc/4-eval/article.md b/1-js/7-js-misc/4-eval/article.md deleted file mode 100644 index 7f8ab9e2..00000000 --- a/1-js/7-js-misc/4-eval/article.md +++ /dev/null @@ -1,266 +0,0 @@ -# Запуск кода из строки: eval - -Функция `eval(code)` позволяет выполнить код, переданный ей в виде строки. - -Этот код будет выполнен в *текущей области видимости*. -[cut] - -## Использование eval - -В простейшем случае `eval` всего лишь выполняет код, например: - -```js -//+ run no-beautify -var a = 1; - -(function() { - - var a = 2; - -*!* - eval(' alert(a) '); // 2 -*/!* - -})() -``` - -Но он может не только выполнить код, но и вернуть результат. - -**Вызов `eval` возвращает последнее вычисленное выражение**: - -Например: - -```js -//+ run -alert( eval('1+1') ); // 2 -``` - -**При вызове `eval` имеет полный доступ к локальным переменным.** - -Это означает, что текущие переменные могут быть изменены или дополнены: - -```js -//+ untrusted refresh run -var x = 5; -eval(" alert( x ); x = 10"); // 5, доступ к старому значению -alert( x ); // 10, значение изменено внутри eval -``` - -[smart header="В строгом режиме `eval` имеет свою область видимости "] -В строгом режиме функционал `eval` чуть-чуть меняется. - -При `use strict` код внутри `eval` по-прежнему сможет читать и менять внешние переменные, однако переменные и функции, объявленные внутри `eval`, не попадут наружу. - -```js -//+ untrusted refresh run -"use strict"; - -*!* -eval("var a = 5; function f() { }"); -*/!* -alert( a ); // ошибка, переменная не определена -// функция f тоже не видна снаружи -``` - -Иными словами, в новом стандарте `eval` имеет свою область видимости, а к внешним переменным обращается через замыкание, аналогично тому, как работают обычные функции. -[/smart] - -## Неграмотное использование eval - -Начнём с того, что `eval` применяется очень редко. Действительно редко. Есть даже такое выражение "eval is evil" (eval -- зло). - -Причина проста: когда-то JavaScript был гораздо более слабым языком, чем сейчас, и некоторые вещи без `eval` было сделать невозможно. Но те времена давно прошли. И теперь найти тот случай, когда действительно надо выполнить код из строки -- это надо постараться. - -Но если вы действительно знаете, что это именно тот случай и вам необходим `eval` -- есть ряд вещей, которые нужно иметь в виду. - -Доступ к локальным переменным -- худшее, что можно сделать при `eval`. - -Дело в том, что локальные переменные могут быть легко переименованы: - -```js -function sayHi() { - var phrase = "Привет"; - eval(str); -} -``` - -Переменная `phrase` может быть переименована в `hello`, и если строка `str` обращается к ней -- будет ошибка. - -Современные средства сжатия JavaScript переименовывают локальные переменные автоматически. Это считается безопасным, так как локальная переменная видна лишь внутри функции и если в ней везде поменять `phrase` на `p`, то никто этого не заметит. - -До сжатия: - -```js -function sayHi() { - var phrase = "Привет"; - alert( phrase ); -} -``` - -После сжатия: - -```js -function sayHi() { - var a = "Привет"; - alert( a ); -} -``` - -На самом деле всё ещё проще -- в данном случае утилита сжатия автоматически уберёт переменную `a` и код станет таким: - -```js -function sayHi() { - alert( "Привет" ); -} -``` - -Итак, если где-то в функции есть `eval`, то его взаимодействие с локальными переменными будет нарушено с непредсказуемыми побочными эффектами. - -Некоторые инструменты сжатия предупреждают, когда видят `eval` или стараются вообще не сжимать такой код вместе с его внешними функциями, но всё это борьба с последствиями кривого кода. - -Как правило, `eval` не нужен, именно поэтому говорят, "eval is evil". - -## Запуск скрипта в глобальной области - -Ок, взаимодействовать с локальными переменными нельзя. - -Но допустим мы загрузили с сервера или вручную сгенерировали скрипт, который нужно выполнить. Желательно, в глобальной области, вне любых функций, чтобы он уж точно к локальным переменным отношения не имел. - -Здесь `eval` может пригодиться. Есть два трюка для выполнения кода в глобальной области: - -
          -
        1. Везде, кроме IE8-, достаточно вызвать `eval` не напрямую, а через `window.eval`. - -Вот так: - -```js -//+ run no-beautify -var a = 1; - -(function() { - - var a = 2; -*!* - window.eval(' alert(a) '); // 1, выполнено глобально везде, кроме IE8- -*/!* -})(); -``` - -
        2. -
        3. В IE8- можно применить нестандартную фунцию [execScript](http://msdn.microsoft.com/en-us/library/ie/ms536420%28v=vs.85%29.aspx). Она, как и `eval`, выполняет код, но всегда в глобальной области видимости и не возвращает значение.
        4. -
        - -Оба способа можно объединить в единой функции `globalEval(code)`, выполняющей код без доступа к локальным переменным: - -```js -//+ run no-beautify -*!* -function globalEval(code) { // объединим два способа в одну функцию - window.execScript ? execScript(code) : window.eval(code); -} -*/!* - -var a = 1; - -(function() { - - var a = 2; - - globalEval(' alert(a) '); // 1, во всех браузерах - -})(); -``` - -## Внешние данные через new Function - -Итак, у нас есть код, который, всё же, нужно выполнить динамически, через `eval`, но не просто скрипт -- а ему нужно передать какие-то значения. - -Как мы говорили ранее, считать их из локальных переменных нельзя: это подвержено ошибкам при переименовании переменных и сразу ломается при сжатии JavaScript. Да и вообще, неочевидно и криво. - -**К счастью, существует отличная альтернатива `eval`, которая позволяет корректно взаимодействовать c внешним кодом: `new Function`.** - -Вызов `new Function('a,b', '..тело..')` создает функцию с указанными аргументами `a,b` и телом. Как мы помним, доступа к текущему замыканию у такой функции не будет, но можно передать параметры и получить результат. - -Например: - -```js -//+ run -var a = 2, - b = 3; - -*!* -// вместо обращения к a,b через eval -// будем принимать их как аргументы динамически созданной функции -var mul = new Function('a, b', ' return a * b;'); -*/!* - -alert( mul(a, b) ); // 6 -``` - -## JSON и eval - -В браузерах IE7- не было методов `JSON.stringify` и `JSON.parse`, поэтому работа с JSON происходила через `eval`. - -Этот способ работы с JSON давно устарел, но его можно встретить кое-где в старом коде, так что для примера рассмотрим его. - -Вызов `eval(code)` выполняет код и, если это выражение, то возвращает его значение, поэтому можно в качестве кода передать JSON. - -Например: - -```js -//+ run -var str = '{ \ - "name": "Вася", \ - "age": 25 \ -}'; - -*!* -var user = eval('(' + str + ')'); -*/!* - -alert( user.name ); // Вася -``` - -Зачем здесь нужны скобки `eval( '(' + str + ')' )`, почему не просто `eval(str)`? - -...Всё дело в том, что в JavaScript с фигурной скобки `{` начинаются не только объекты, а в том числе и "блоки кода". Что имеется в виду в данном случае -- интерпретатор определяет по контексту. Если в основном потоке кода -- то блок, если в контексте выражения, то объект. - -Поэтому если передать в `eval` объект напрямую, то интерпретатор подумает, что это на самом деле блок кода, а там внутри какие-то двоеточия... - -Вот, для примера, `eval` без скобок, он выдаст ошибку: - -```js -//+ run -var user = eval('{ "name": "Вася", "age": 25 }'); -``` - -А если `eval` получает выражение в скобках `( ... )`, то интерпретатор точно знает, что это не блок кода, а объект: - -```js -//+ run -var user = eval('( { "name": "Вася", "age": 25 } )'); -alert( user.age ); // 25 -``` - -[warn header="Осторожно, злой JSON!"] -Если мы получаем JSON из недоверенного источника, например с чужого сервера, то разбор через `eval` может быть опасен. - -Например, чужой сервер может быть взломан (за свой-то код мы отвечаем, а за чужой -- нет) и вместо JSON вставлен злонамеренный JavaScript-код. - -**Поэтому рекомендуется, всё же, использовать `JSON.parse`.** - -При разборе через `JSON.parse` некорректный JSON просто приведёт к ошибке, а вот при разборе через `eval` этот код реально выполнится, он может вывести что-то на странице, перенаправить посетителя куда-то и т.п. -[/warn] - - -## Итого - -
          -
        • Функция `eval(str)` выполняет код и возвращает последнее вычисленное выражение. В современном JavaScript она используется редко.
        • -
        • Вызов `eval` может читать и менять локальные переменные. Это -- зло, которого нужно избегать.
        • -
        • Для выполнения скрипта в глобальной области используются трюк с `window.eval/execScript`. При этом локальные переменные не будут затронуты, так что такое выполнение безопасно и иногда, в редких архитектурах, может быть полезным.
        • -
        • Если нужно выполняемый код всё же должен взаимодействовать с локальными переменными -- используйте `new Function`. Создавайте функцию из строки и передавайте переменные ей, это надёжно и безопасно.
        • -
        - -Ещё примеры использования `eval` вы найдёте далее, в главе [](/json). - diff --git a/1-js/7-js-misc/5-exception/1-finally-or-code-after/solution.md b/1-js/7-js-misc/5-exception/1-finally-or-code-after/solution.md deleted file mode 100644 index 5befa284..00000000 --- a/1-js/7-js-misc/5-exception/1-finally-or-code-after/solution.md +++ /dev/null @@ -1,43 +0,0 @@ -Разница в поведении станет очевидной, если рассмотреть код внутри функции. - -Поведение будет различным, если управление каким-то образом выпрыгнет из `try..catch`. - -Например, `finally` сработает после `return`: - -```js -function f() { - try { - ... -*!* - return result; -*/!* - } catch (e) { - ... - } finally { - очистить ресурсы - } -} -``` - -Или же управление может выпрыгнуть из-за `throw`: - -```js -function f() { - try { - ... - - } catch (e) { - ... - if(не умею обрабатывать эту ошибку) { -*!* - throw e; -*/!* - } - - } finally { - очистить ресурсы - } -} -``` - -В этих случаях именно `finally` гарантирует выполнение кода до окончания работы `f`, просто код не будет вызван. \ No newline at end of file diff --git a/1-js/7-js-misc/5-exception/1-finally-or-code-after/task.md b/1-js/7-js-misc/5-exception/1-finally-or-code-after/task.md deleted file mode 100644 index 5c93daf5..00000000 --- a/1-js/7-js-misc/5-exception/1-finally-or-code-after/task.md +++ /dev/null @@ -1,43 +0,0 @@ -# Finally или просто код? - -[importance 5] - -Сравните два фрагмента кода. - -
          -
        1. Первый использует `finally` для выполнения кода по выходу из `try..catch`: - -```js -try { - начать работу - работать -} catch (e) { - обработать ошибку -} finally { -*!* - финализация: завершить работу -*/!* -} -``` - -
        2. -
        3. Второй фрагмент просто ставит очистку ресурсов за `try..catch`: - -```js -try { - начать работу -} catch (e) { - обработать ошибку -} - -*!* -финализация: завершить работу -*/!* -``` - -
        4. -
        - -Нужно, чтобы код финализации всегда выполнялся при выходе из блока `try..catch` и, таким образом, заканчивал начатую работу. Имеет ли здесь `finally` какое-то преимущество или оба фрагмента работают одинаково? - -Если имеет, то дайте пример когда код с `finally` работает верно, а без -- неверно. diff --git a/1-js/7-js-misc/5-exception/2-eval-calculator-errors/solution.md b/1-js/7-js-misc/5-exception/2-eval-calculator-errors/solution.md deleted file mode 100644 index a9cd06aa..00000000 --- a/1-js/7-js-misc/5-exception/2-eval-calculator-errors/solution.md +++ /dev/null @@ -1,36 +0,0 @@ -Вычислить любое выражение нам поможет `eval`: - -```js -//+ run -alert( eval("2+2") ); // 4 -``` - -Считываем выражение в цикле `while(true)`. Если при вычислении возникает ошибка -- ловим её в `try..catch`. - -Ошибкой считается, в том числе, получение `NaN` из `eval`, хотя при этом исключение не возникает. Можно бросить своё исключение в этом случае. - -Код решения: - -```js -//+ run demo -var expr, res; - -while (true) { - expr = prompt("Введите выражение?", '2-'); - if (expr == null) break; - - try { - res = eval(expr); - if (isNaN(res)) { - throw new Error("Результат неопределён"); - } - - break; - } catch (e) { - alert( "Ошибка: " + e.message + ", повторите ввод" ); - } -} - -alert( res ); -``` - diff --git a/1-js/7-js-misc/5-exception/2-eval-calculator-errors/task.md b/1-js/7-js-misc/5-exception/2-eval-calculator-errors/task.md deleted file mode 100644 index 73e5108f..00000000 --- a/1-js/7-js-misc/5-exception/2-eval-calculator-errors/task.md +++ /dev/null @@ -1,13 +0,0 @@ -# Eval-калькулятор с ошибками - -[importance 5] - -Напишите интерфейс, который принимает математическое выражение (в `prompt`) и результат его вычисления через `eval`. - -**При ошибке нужно выводить сообщение и просить переввести выражение**. - -Ошибкой считается не только некорректное выражение, такое как `2+`, но и выражение, возвращающее `NaN`, например `0/0`. - -[demo /] - - diff --git a/1-js/7-js-misc/5-exception/article.md b/1-js/7-js-misc/5-exception/article.md deleted file mode 100644 index 42b30917..00000000 --- a/1-js/7-js-misc/5-exception/article.md +++ /dev/null @@ -1,590 +0,0 @@ -# Перехват ошибок, "try..catch" - -Как бы мы хорошо ни программировали, в коде бывают ошибки. Или, как их иначе называют, "исключительные ситуации" (исключения). - -Обычно скрипт при ошибке, как говорят, "падает", с выводом ошибки в консоль. - -Но бывают случаи, когда нам хотелось бы как-то контролировать ситуацию, чтобы скрипт не просто "упал", а сделал что-то разумное. - -Для этого в JavaScript есть замечательная конструкция `try..catch`. - -[cut] - -## Конструкция try..catch - -Конструкция `try..catch` состоит из двух основных блоков: `try`, и затем `catch`: - -```js -try { - - // код ... - -} catch (err) { - - // обработка ошибки - -} -``` - -Работает она так: -
          -
        1. Выполняется код внутри блока `try`.
        2. -
        3. Если в нём ошибок нет, то блок `catch(err)` игнорируется, то есть выполнение доходит до конца `try` и потом прыгает через `catch`.
        4. -
        5. Если в нём возникнет ошибка, то выполнение `try` на ней прерывается, и управление прыгает в начало блока `catch(err)`. - -При этом переменная `err` (можно выбрать и другое название) будет содержать объект ошибки с подробной информацией о произошедшем.
        6. -
        - -**Таким образом, при ошибке в `try` скрипт не "падает", и мы получаем возможность обработать ошибку внутри `catch`.** - -Посмотрим это на примерах. - -
          -
        • Пример без ошибок: при запуске сработают `alert` `(1)` и `(2)`: - -```js -//+ run -try { - - alert('Начало блока try'); // *!*(1) <--*/!* - - // .. код без ошибок - - alert('Конец блока try'); // *!*(2) <--*/!* - -} catch(e) { - - alert('Блок catch не получит управление, так как нет ошибок'); // (3) - -} - -alert("Потом код продолжит выполнение..."); -``` - -
        • -
        • Пример с ошибкой: при запуске сработают `(1)` и `(3)`: - -```js -//+ run -try { - - alert('Начало блока try'); // *!*(1) <--*/!* - -*!* - lalala; // ошибка, переменная не определена! -*/!* - - alert('Конец блока try'); // (2) - -} catch(e) { - - alert('Ошибка ' + e.name + ":" + e.message + "\n" + e.stack); // *!*(3) <--*/!* - -} - -alert("Потом код продолжит выполнение..."); -``` - -
        • -
        - -[warn header="`try..catch` подразумевает, что код синтаксически верен"] -Если грубо нарушена структура кода, например не закрыта фигурная скобка или где-то стоит лишняя запятая, то никакой `try..catch` здесь не поможет. Такие ошибки называются *синтаксическими*, интерпретатор не может понять такой код. - -Здесь же мы рассматриваем ошибки *семантические*, то есть происходящие в корректном коде, в процессе выполнения. -[/warn] - - -[warn header="`try..catch` работает только в синхронном коде"] -Ошибку, которая произойдёт в коде, запланированном "на будущее", например, в `setTimeout`, `try..catch` не поймает: - -```js -//+ run -try { - setTimeout(function() { - throw new Error(); // вылетит в консоль - }, 1000); -} catch (e) { - alert( "не сработает" ); -} -``` - -На момент запуска функции, назначенной через `setTimeout`, этот код уже завершится, интерпретатор выйдет из блока `try..catch`. - -Чтобы поймать ошибку внутри функции из `setTimeout`, и `try..catch` должен быть в той же функции. -[/warn] - - -## Объект ошибки - -В примере выше мы видим объект ошибки. У него есть три основных свойства: -
        -
        `name`
        -
        Тип ошибки. Например, при обращении к несуществующей переменной: `"ReferenceError"`.
        -
        `message`
        -
        Текстовое сообщение о деталях ошибки.
        -
        `stack`
        -
        Везде, кроме IE8-, есть также свойство `stack`, которое содержит строку с информацией о последовательности вызовов, которая привела к ошибке.
        -
        - -В зависимости от браузера, у него могут быть и дополнительные свойства, см. Error в MDN и Error в MSDN. - -## Пример использования - -В JavaScript есть встроенный метод [JSON.parse(str)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/parse), который используется для чтения JavaScript-объектов (и не только) из строки. - -Обычно он используется для того, чтобы обрабатывать данные, полученные по сети, с сервера или из другого источника. - -Мы получаем их и вызываем метод `JSON.parse`, вот так: - -```js -//+ run -var data = '{"name":"Вася", "age": 30}'; // строка с данными, полученная с сервера - -var user = JSON.parse(data); // преобразовали строку в объект - -// теперь user -- это JS-объект с данными из строки -alert( user.name ); // Вася -alert( user.age ); // 30 -``` - -Более детально формат JSON разобран в главе [](/json). - -**В случае, если данные некорректны, `JSON.parse` генерирует ошибку, то есть скрипт "упадёт".** - -Устроит ли нас такое поведение? Конечно нет! - -Получается, что если вдруг что-то не так с данными, то посетитель никогда (если, конечно, не откроет консоль) об этом не узнает. - -А люди очень-очень не любят, когда что-то "просто падает", без всякого объявления об ошибке. - -**Бывают ситуации, когда без `try..catch` не обойтись, это -- одна из таких.** - -Используем `try..catch`, чтобы обработать некорректный ответ: - -```js -//+ run -var data = "Has Error"; // в данных ошибка - -try { - - var user = JSON.parse(data); // <-- ошибка при выполнении - alert( user.name ); // не сработает - -} catch (e) { - // ...выполнится catch - alert( "Извините, в данных ошибка, мы попробуем получить их ещё раз" ); - alert( e.name ); - alert( e.message ); -} -``` - -Здесь в `alert` только выводится сообщение, но область применения гораздо шире: можно повторять запрос, можно предлагать посетителю использовать альтернативный способ, можно отсылать информацию об ошибке на сервер... Свобода действий. - -## Генерация своих ошибок - -Представим на минуту, что данные являются корректным JSON... Но в этом объекте нет нужного свойства `name`: - -```js -//+ run -var data = '{ "age": 30 }'; // данные неполны - -try { - - var user = JSON.parse(data); // <-- выполнится без ошибок -*!* - alert( user.name ); // undefined -*/!* - -} catch (e) { - // не выполнится - alert( "Извините, в данных ошибка" ); -} -``` - -Вызов `JSON.parse` выполнится без ошибок, но ошибка в данных есть. И, так как свойство `name` обязательно должно быть, то для нас это такие же некорректные данные как и `"Has Error"`. - -Для того, чтобы унифицировать и объединить обработку ошибок парсинга и ошибок в структуре, мы воспользуемся оператором `throw`. - -### Оператор throw - -Оператор `throw` генерирует ошибку. - -Синтаксис: `throw <объект ошибки>`. - -Технически, в качестве объекта ошибки можно передать что угодно, это может быть даже не объект, а число или строка, но всё же лучше, чтобы это был объект, желательно -- совместимый со стандартным, то есть чтобы у него были как минимум свойства `name` и `message`. - -**В качестве конструктора ошибок можно использовать встроенный конструктор: `new Error(message)` или любой другой.** - -В JavaScript встроен ряд конструкторов для стандартных ошибок: `SyntaxError`, `ReferenceError`, `RangeError` и некоторые другие. Можно использовать и их, но только чтобы не было путаницы. - -В данном случае мы используем конструктор `new SyntaxError(message)`. Он создаёт ошибку того же типа, что и `JSON.parse`. - -```js -//+ run -var data = '{ "age": 30 }'; // данные неполны - -try { - - var user = JSON.parse(data); // <-- выполнится без ошибок - -*!* - if (!user.name) { - throw new SyntaxError("Данные некорректны"); - } -*/!* - - alert( user.name ); - -} catch (e) { - alert( "Извините, в данных ошибка" ); -} -``` - -Получилось, что блок `catch` -- единое место для обработки ошибок во всех случаях: когда ошибка выявляется при `JSON.parse` или позже. - -## Проброс исключения - -В коде выше мы предусмотрели обработку ошибок, которые возникают при некорректных данных. Но может ли быть так, что возникнет какая-то другая ошибка? - -Конечно, может! Код -- это вообще мешок с ошибками, бывает даже так что библиотеку выкладывают в открытый доступ, она там 10 лет лежит, её смотрят миллионы людей и на 11й год находятся опаснейшие ошибки. Такова жизнь, таковы люди. - -Блок `catch` в нашем примере предназначен для обработки ошибок, возникающих при некорректных данных. Если же в него попала какая-то другая ошибка, то вывод сообщения о "некорректных данных" будет дезинформацией посетителя. - -**Ошибку, о которой `catch` не знает, он не должен обрабатывать.** - -Такая техника называется *"проброс исключения"*: в `catch(e)` мы анализируем объект ошибки, и если он нам не подходит, то делаем `throw e`. - -При этом ошибка "выпадает" из `try..catch` наружу. Далее она может быть поймана либо внешним блоком `try..catch` (если есть), либо "повалит" скрипт. - -В примере ниже `catch` обрабатывает только ошибки `SyntaxError`, а остальные -- выбрасывает дальше: - -```js -//+ run -var data = '{ "name": "Вася", "age": 30 }'; // данные корректны - -try { - - var user = JSON.parse(data); - - if (!user.name) { - throw new SyntaxError("Ошибка в данных"); - } - -*!* - blabla(); // произошла непредусмотренная ошибка -*/!* - - alert( user.name ); - -} catch (e) { - -*!* - if (e.name == "SyntaxError") { - alert( "Извините, в данных ошибка" ); - } else { - throw e; - } -*/!* - -} -``` - -Заметим, что ошибка, которая возникла внутри блока `catch`, "выпадает" наружу, как если бы была в обычном коде. - -В следующем примере такие ошибки обрабатываются ещё одним, "более внешним" `try..catch`: - -```js -//+ run -function readData() { - var data = '{ "name": "Вася", "age": 30 }'; - - try { - // ... -*!* - blabla(); // ошибка! -*/!* - } catch (e) { - // ... -*!* - if (e.name != 'SyntaxError') { - throw e; // пробрасываем - } -*/!* - } -} - - -try { - readData(); -} catch (e) { -*!* - alert( "Поймал во внешнем catch: " + e ); // ловим -*/!* -} -``` - -В примере выше `try..catch` внутри `readData` умеет обрабатывать только `SyntaxError`, а внешний -- все ошибки. - -Без внешнего проброшенная ошибка "вывалилась" бы в консоль, с остановкой скрипта. - -## Оборачивание исключений - -И, для полноты картины -- последняя, самая продвинутая техника по работе с ошибками. Она, впрочем, является стандартной практикой во многих объектно-ориентированных языках. - -Цель функции `readData` в примере выше -- прочитать данные. При чтении могут возникать разные ошибки, не только `SyntaxError`, но и, возможно, к примеру, `URIError` (неправильное применение функций работы с URI), да и другие. - -Код, который вызвал `readData`, хотел бы иметь либо результат, либо информацию об ошибке. - -При этом очень важным является вопрос: обязан ли этот внешний код знать о всевозможных типах ошибок, которые могут возникать при чтении данных, и уметь перехватывать их? - -Обычно внешний код хотел бы работать "на уровень выше", и получать либо результат, либо "ошибку чтения данных", при этом какая именно ошибка произошла -- ему неважно. Ну, или, если будет важно, то хотелось бы иметь возможность это узнать, но обычно не требуется. - -Это важнейший общий подход к проектированию -- каждый участок функционала должен получать информацию на том уровне, который ему необходим. - -Мы его видим везде в грамотно построенном коде, но не всегда отдаём себе в этом отчёт. - -В данном случае, если при чтении данных происходит ошибка, то мы будем генерировать её в виде объекта `ReadError`, с соответствующим сообщением. А "исходную" ошибку -- на всякий случай тоже сохраним, присвоим в свойство `cause` (англ. -- причина). - -Выглядит это так: -```js -//+ run -function ReadError(message, cause) { - this.message = message; - this.cause = cause; - this.name = 'ReadError'; - this.stack = cause.stack; -} - -function readData() { - var data = '{ bad data }'; - - try { - // ... - JSON.parse(data); - // ... - } catch (e) { - // ... - if (e.name == 'URIError') { - throw new ReadError("Ошибка в URI", e); - } else if (e.name == 'SyntaxError') { -*!* - throw new ReadError("Синтаксическая ошибка в данных", e); -*/!* - } else { - throw e; // пробрасываем - } - } -} - - -try { - readData(); -} catch (e) { - if (e.name == 'ReadError') { - alert( e.message ); - alert( e.cause ); // оригинальная ошибка-причина - } else { - throw e; - } -} -``` - -Этот подход называют "оборачиванием" исключения, поскольку мы берём ошибки "более низкого уровня" и "заворачиваем" их в `ReadError`, которая соответствует текущей задаче. - -## Секция finally - -Конструкция `try..catch` может содержать ещё один блок: `finally`. - -Выглядит этот расширенный синтаксис так: - -```js -*!*try*/!* { - .. пробуем выполнить код .. -} *!*catch*/!*(e) { - .. перехватываем исключение .. -} *!*finally*/!* { - .. выполняем всегда .. -} -``` - -Секция `finally` не обязательна, но если она есть, то она выполняется всегда: -
          -
        • после блока `try`, если ошибок не было,
        • -
        • после `catch`, если они были.
        • -
        - -Попробуйте запустить такой код? - -```js -//+ run -try { - alert( 'try' ); - if (confirm('Сгенерировать ошибку?')) BAD_CODE(); -} catch (e) { - alert( 'catch' ); -} finally { - alert( 'finally' ); -} -``` - -У него два варианта работы: -
          -
        1. Если вы ответите на вопрос "Сгенерировать ошибку?" утвердительно, то `try -> catch -> finally`.
        2. -
        3. Если ответите отрицательно, то `try -> finally`. -
        - -**Секцию `finally` используют, чтобы завершить начатые операции при любом варианте развития событий.** - -Например, мы хотим подсчитать время на выполнение функции `sum(n)`, которая должна возвратить сумму чисел от `1` до `n` и работает рекурсивно: - -```js -//+ run -function sum(n) { - return n ? (n + sum(n - 1)) : 0; -} - -var n = +prompt('Введите n?', 100); - -var start = new Date(); - -try { - var result = sum(n); -} catch (e) { - result = 0; -*!* -} finally { - var diff = new Date() - start; -} -*/!* - -alert( result ? result : 'была ошибка' ); -alert( "Выполнение заняло " + diff ); -``` - -Здесь секция `finally` гарантирует, что время будет подсчитано в любых ситуациях -- при ошибке в `sum` или без неё. - -Вы можете проверить это, запустив код с указанием `n=100` -- будет без ошибки, `finally` выполнится после `try`, а затем с `n=100000` -- будет ошибка из-за слишком глубокой рекурсии, управление прыгнет в `finally` после `catch`. - -[smart header="`finally` и `return`"] - -Блок `finally` срабатывает при *любом* выходе из `try..catch`, в том числе и `return`. - -В примере ниже, из `try` происходит `return`, но `finally` получает управление до того, как контроль возвращается во внешний код. - -```js -//+ run -function func() { - - try { - // сразу вернуть значение - return 1; - - } catch (e) { - /* ... */ - } finally { -*!* - alert( 'finally' ); -*/!* - } -} - -alert( func() ); // сначала finally, потом 1 -``` - -Если внутри `try` были начаты какие-то процессы, которые нужно завершить по окончании работы, во в `finally` это обязательно будет сделано. - -Кстати, для таких случаев иногда используют `try..finally` вообще без `catch`: - -```js -//+ run -function func() { - try { - return 1; - } finally { - alert( 'Вызов завершён' ); - } -} - -alert( func() ); // сначала finally, потом 1 -``` - -В примере выше `try..finally` вообще не обрабатывает ошибки. Задача в другом -- выполнить код при любом выходе из `try` -- с ошибкой ли, без ошибок или через `return`. -[/smart] - - -## Последняя надежда: window.onerror - -Допустим, ошибка произошла вне блока `try..catch` или выпала из `try..catch` наружу, во внешний код. Скрипт упал. - -Можно ли как-то узнать о том, что произошло? Да, конечно. - -В браузере существует специальное свойство `window.onerror`, если в него записать функцию, то она выполнится и получит в аргументах сообщение ошибки, текущий URL и номер строки, откуда "выпала" ошибка. - -Необходимо лишь позаботиться, чтобы функция была назначена заранее. - -Например: - -```html - - -``` - -Как правило, роль `window.onerror` заключается в том, чтобы не оживить скрипт -- скорее всего, это уже невозможно, а в том, чтобы отослать сообщение об ошибке на сервер, где разработчики о ней узнают. - -Существуют даже специальные веб-сервисы, которые предоставляют скрипты для отлова и аналитики таких ошибок, например: [](https://errorception.com/) или [](http://www.muscula.com/). - - -## Итого - -Обработка ошибок -- большая и важная тема. - -В JavaScript для этого предусмотрены: - -
          -
        • Конструкция `try..catch..finally` -- она позволяет обработать произвольные ошибки в блоке кода. - -Это удобно в тех случаях, когда проще сделать действие и потом разбираться с результатом, чем долго и нудно проверять, не упадёт ли чего. - -Кроме того, иногда проверить просто невозможно, например `JSON.parse(str)` не позволяет "проверить" формат строки перед разбором. В этом случае блок `try..catch` необходим. - -Полный вид конструкции: - -```js -*!*try*/!* { - .. пробуем выполнить код .. -} *!*catch*/!*(e) { - .. перехватываем исключение .. -} *!*finally*/!* { - .. выполняем всегда .. -} -``` - -Возможны также варианты `try..catch` или `try..finally`.
        • -
        • Оператор `throw err` генерирует свою ошибку, в качестве `err` рекомендуется использовать объекты, совместимые с встроенным типом [Error](http://javascript.ru/Error), содержащие свойства `message` и `name`.
        • -
        - -Кроме того, мы рассмотрели некоторые важные приёмы: - -
          -
        • Проброс исключения -- `catch(err)` должен обрабатывать только те ошибки, которые мы рассчитываем в нём увидеть, остальные -- пробрасывать дальше через `throw err`. - -Определить, нужная ли это ошибка, можно, например, по свойству `name`.
        • -
        • Оборачивание исключений -- функция, в процессе работы которой возможны различные виды ошибок, может "обернуть их" в одну общую ошибку, специфичную для её задачи, и уже её пробросить дальше. Чтобы, при необходимости, можно было подробно определить, что произошло, исходную ошибку обычно присваивают в свойство этой, общей. Обычно это нужно для логирования.
        • -
        • В `window.onerror` можно присвоить функцию, которая выполнится при любой "выпавшей" из скрипта ошибке. Как правило, это используют в информационных целях, например отправляют информацию об ошибке на специальный сервис.
        • -
        - - diff --git a/1-js/7-js-misc/index.md b/1-js/7-js-misc/index.md deleted file mode 100644 index 091a171f..00000000 --- a/1-js/7-js-misc/index.md +++ /dev/null @@ -1,3 +0,0 @@ -# Некоторые другие возможности - -Различные возможности JavaScript, которые достаточно важны, но не заслужили отдельного раздела. \ No newline at end of file diff --git a/1-js/8-oop/1-about-oop/article.md b/1-js/8-oop/1-about-oop/article.md deleted file mode 100644 index 9039a50c..00000000 --- a/1-js/8-oop/1-about-oop/article.md +++ /dev/null @@ -1,56 +0,0 @@ -# Введение - -На протяжении долгого времени в программировании применялся [процедурный подход](http://ru.wikipedia.org/wiki/%D0%9F%D1%80%D0%BE%D1%86%D0%B5%D0%B4%D1%83%D1%80%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5). При этом программа состоит из функций, вызывающих друг друга. - -Гораздо позже появилось [объектно-ориентированное программирование](http://ru.wikipedia.org/wiki/%D0%9E%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D0%BD%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5) (ООП), которое позволяет группировать функции и данные в единой сущности -- "объекте". - - -При объектно-ориентированной разработке мы описываем происходящее на уровне объектов, которые создаются, меняют свои свойства, взаимодействуют друг с другом и (в случае браузера) со страницей, в общем, живут. - -Например, "пользователь", "меню", "компонент интерфейса"... При объектно-ориентированном подходе каждый объект должен представлять собой интуитивно понятную сущность, у которой есть методы и данные. - -[warn header="ООП -- это не просто объекты"] -В JavaScript объекты часто используются просто как коллекции. - -Например, встроенный объект [Math](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Math) содержит функции (`Math.sin`, `Math.pow`, ...) и данные (константа `Math.PI`). - -При таком использовании объектов мы не можем сказать, что "применён объектно-ориентированный подход". В частности, никакую "единую сущность" `Math` из себя не представляет, это просто коллекция независимых функций с общим префиксом `Math`. -[/warn] - - -Мы уже работали в ООП-стиле, создавая объекты такого вида: - -```js -//+ run -function User(name) { - - this.sayHi = function() { - alert( "Привет, я " + name ); - }; - -} - -var vasya = new User("Вася"); // создали пользователя -vasya.sayHi(); // пользователь умеет говорить "Привет" -``` - -Здесь мы видим ярко выраженную сущность -- `User` (посетитель). Используя терминологию ООП, такие конструкторы часто называют *классами*, то есть можно сказать "класс `User`". - -[smart header="Класс в ООП"] -[Классом]("https://en.wikipedia.org/wiki/Class_(computer_programming)") в объектно-ориентированной разработке называют шаблон/программный код, предназначенный для создания объектов и методов. - -В JavaScript классы можно организовать по-разному. Говорят, что класс `User` написан в "функциональном" стиле. Далее мы также увидим "прототипный" стиль. -[/smart] - -ООП -- это наука о том, как делать правильную архитектуру. У неё есть свои принципы, например [SOLID](https://ru.wikipedia.org/wiki/SOLID_%28%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D0%BD%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%29). - -По приёмам объектно-ориентированной разработки пишут книги, к примеру: - - - -Здесь мы не имеем возможности углубиться в теорию ООП, поэтому чтение таких книг рекомендуется. Хотя основные принципы, как использовать ООП правильно, мы, всё же, затронем. \ No newline at end of file diff --git a/1-js/8-oop/2-internal-external-interface/1-add-method-property-coffeemachine/solution.md b/1-js/8-oop/2-internal-external-interface/1-add-method-property-coffeemachine/solution.md deleted file mode 100644 index 5c92acb6..00000000 --- a/1-js/8-oop/2-internal-external-interface/1-add-method-property-coffeemachine/solution.md +++ /dev/null @@ -1,42 +0,0 @@ -Кофеварка с новым методом: - -```js -//+ run -function CoffeeMachine(power) { - this.waterAmount = 0; - - var WATER_HEAT_CAPACITY = 4200; -*!* - var timerId; -*/!* - var self = this; - - function getBoilTime() { - return self.waterAmount * WATER_HEAT_CAPACITY * 80 / power; - } - - function onReady() { - alert( 'Кофе готово!' ); - } - - this.run = function() { -*!* - timerId = setTimeout(onReady, getBoilTime()); -*/!* - }; - -*!* - this.stop = function() { - clearTimeout(timerId) - }; -*/!* -} - - -var coffeeMachine = new CoffeeMachine(50000); -coffeeMachine.waterAmount = 200; - -coffeeMachine.run(); -coffeeMachine.stop(); // кофе приготовлен не будет -``` - diff --git a/1-js/8-oop/2-internal-external-interface/1-add-method-property-coffeemachine/task.md b/1-js/8-oop/2-internal-external-interface/1-add-method-property-coffeemachine/task.md deleted file mode 100644 index 62177288..00000000 --- a/1-js/8-oop/2-internal-external-interface/1-add-method-property-coffeemachine/task.md +++ /dev/null @@ -1,43 +0,0 @@ -# Добавить метод и свойство кофеварке - -[importance 5] - -Улучшите готовый код кофеварки, который дан ниже: добавьте в кофеварку *публичный* метод `stop()`, который будет останавливать кипячение (через `clearTimeout`). - -```js -//+ run -function CoffeeMachine(power) { - this.waterAmount = 0; - - var WATER_HEAT_CAPACITY = 4200; - - var self = this; - - function getBoilTime() { - return self.waterAmount * WATER_HEAT_CAPACITY * 80 / power; - } - - function onReady() { - alert( 'Кофе готово!' ); - } - - this.run = function() { - setTimeout(onReady, getBoilTime()); - }; - -} -``` - -Вот такой код должен ничего не выводить: - -```js -var coffeeMachine = new CoffeeMachine(50000); -coffeeMachine.waterAmount = 200; - -coffeeMachine.run(); -coffeeMachine.stop(); // кофе приготовлен не будет -``` - -P.S. Текущую температуру воды вычислять и хранить не требуется. - -P.P.S. При решении вам, скорее всего, понадобится добавить *приватное* свойство `timerId`, которое будет хранить текущий таймер. \ No newline at end of file diff --git a/1-js/8-oop/2-internal-external-interface/article.md b/1-js/8-oop/2-internal-external-interface/article.md deleted file mode 100644 index b4058737..00000000 --- a/1-js/8-oop/2-internal-external-interface/article.md +++ /dev/null @@ -1,338 +0,0 @@ -# Внутренний и внешний интерфейс - -Один из важнейших принципов ООП -- отделение внутреннего интерфейса от внешнего. - -Это -- обязательная практика в разработке чего угодно сложнее hello world. - -Чтобы это понять, отвлечемся от разработки и переведем взгляд на объекты реального мира. - -Как правило, устройства, с которыми мы имеем дело, весьма сложны. Но *разделение интерфейса на внешний и внутренний* позволяет использовать их без малейших проблем. -[cut] -## Пример из жизни - -Например, кофеварка. Простая снаружи: кнопка, индикатор, отверстия,... И, конечно, результат -- кофе :) - - - -Но внутри... (картинка из пособия по ремонту) - - - -Масса деталей. Но мы можем пользоваться ей, совершенно не зная об этом. - -Кофеварки -- довольно-таки надежны, не правда ли? Можно пользоваться годами, и только когда что-то пойдет не так -- придется нести к мастеру. - -Секрет надежности и простоты кофеварки -- в том, что все детали отлажены и *спрятаны* внутри. - -Если снять с кофеварки защитный кожух, то использование её будет более сложным (куда нажимать?) и опасным (током ударить может). - -Как мы увидим, объекты очень схожи с кофеварками. - -Только для того, чтобы прятать внутренние детали, используется не кожух, а специальные средства языка и соглашения. - -## Внутренний и внешний интерфейс - -В программировании мы будем разделять методы и свойства объекта на две группы: - -
          -
        • *Внутренний интерфейс* -- это свойства и методы, доступ к которым может быть осуществлен только из других методов объекта, их также называют "приватными" (есть и другие термины, встретим их далее).
        • - -
        • *Внешний интерфейс* -- это свойства и методы, доступные снаружи объекта, их называют "публичными".
        • -
        - -Если продолжить аналогию с кофеваркой -- то, что спрятано внутри кофеварки: трубка кипятильника, нагревательный элемент, тепловой предохранитель и так далее -- это её внутренний интерфейс. - -Внутренний интерфейс используется для обеспечения работоспособности объекта, его детали используют друг друга. Например, трубка кипятильника подключена к нагревательному элементу. - -Но снаружи кофеварка закрыта специальным кожухом, чтобы никто к ним не подобрался. Детали скрыты и недоступны. Виден лишь внешний интерфейс. - -Получив объект, всё, что нужно для пользования им -- это знать внешний интерфейс. О внутреннем же знать вообще не обязательно. - -Это были общие слова по теории программирования. - -Далее мы реализуем кофеварку на JavaScript с приватными и публичными свойствами. В кофеварке много деталей, мы конечно, не будем моделировать каждый винтик, а сосредоточимся на основных приёмах разработки. - -## Шаг 1: публичное и приватное свойство - -Конструктор кофеварок будет называться `CoffeeMachine`. - -```js -//+ run -function CoffeeMachine(power) { - this.waterAmount = 0; // количество воды в кофеварке - - alert( 'Создана кофеварка мощностью: ' + power + ' ватт' ); -} - -// создать кофеварку -var coffeeMachine = new CoffeeMachine(100); - -// залить воды -coffeeMachine.waterAmount = 200; -``` - -**Локальные переменные, включая параметры конструктора, можно считать приватными свойствами.** - -В примере выше это `power` -- мощность кофеварки, которая указывается при создании и далее будет использована для расчёта времени кипячения. - -К локальным переменным конструктора нельзя обратиться снаружи, но они доступны внутри самого конструктора. - -**Свойства, записанные в `this`, можно считать публичными.** - -Здесь свойство `waterAmount` записано в объект, а значит -- доступно для модификации снаружи. Можно доливать и выливать воду в любом количестве. - -[smart header="Вопрос терминологии"] -Далее мы будем называть `power` как "локальной переменной", так и "приватным свойством" объекта. - -Это, смотря, с какой стороны посмотреть. - -Термины "приватное свойство/метод", "публичное свойство/метод" относятся к общей теории ООП. А их конкретная реализация в языке программирования может быть различной. - -Здесь ООП-принцип "приватного свойства" реализован через локальные переменные, поэтому и "локальная переменная" и "приватное свойство" -- правильные термины, в зависимости от того, с какой точки зрения взглянуть -- кода или архитектуры ООП. -[/smart] - - -## Шаг 2: публичный и приватный методы - -Добавим публичный метод `run`, запускающий кофеварку, а также вспомогательные внутренние методы `getBoilTime` и `onReady`: - -```js -//+ run -function CoffeeMachine(power) { - - this.waterAmount = 0; - -*!* - // расчёт времени для кипячения - function getBoilTime() { - return 1000; // точная формула расчета будет позже - } - - // что делать по окончании процесса - function onReady() { - alert( 'Кофе готово!' ); - } - - this.run = function() { - // setTimeout - встроенная функция, - // она запустит onReady через getBoilTime() миллисекунд - setTimeout(onReady, getBoilTime()); - }; -*/!* -} - -var coffeeMachine = new CoffeeMachine(100); -coffeeMachine.waterAmount = 200; - -coffeeMachine.run(); -``` - -Приватные методы, такие как `onReady`, `getBoilTime` могут быть объявлены как вложенные функции. - -В результате естественным образом получается, что доступ к ним (через замыкание) имеют только другие функции, объявленные в том же конструкторе. - -## Шаг 3: константа - -Для расчёта времени на кипячение воды используется формула `c*m*ΔT / power`, где: -
          -
        • `c` -- коэффициент теплоёмкости воды, физическая константа равная `4200`.
        • -
        • `m` -- масса воды, которую нужно согреть.
        • -
        • `ΔT` -- температура, на которую нужно подогреть, будем считать, что изначально вода -- комнатной температуры 20°С, то есть до 100° нужно греть на `ΔT=80`.
        • -
        • `power` -- мощность.
        • -
        - -Используем её в более реалистичном варианте `getBoilTime()`, включающем использование приватных свойств и константу: - -```js -//+ run -"use strict" - -function CoffeeMachine(power) { - - this.waterAmount = 0; - -*!* - // физическая константа - удельная теплоёмкость воды для getBoilTime - var WATER_HEAT_CAPACITY = 4200; - - // расчёт времени для кипячения - function getBoilTime() { - return this.waterAmount * WATER_HEAT_CAPACITY * 80 / power; // ошибка! - } -*/!* - - // что делать по окончании процесса - function onReady() { - alert( 'Кофе готово!' ); - } - - this.run = function() { - setTimeout(onReady, getBoilTime()); - }; - -} - -var coffeeMachine = new CoffeeMachine(1000); -coffeeMachine.waterAmount = 200; - -coffeeMachine.run(); -``` - -Удельная теплоёмкость `WATER_HEAT_CAPACITY` выделена большими буквами, так как это константа. - -Внимание, при запуске кода выше в методе `getBoilTime` будет ошибка. Как вы думаете, почему? - -## Шаг 4: доступ к объекту из внутреннего метода - -Внутренний метод вызывается так: `getBoilTime()`. А чему при этом равен `this`?... Как вы наверняка помните, в современном стандарте он будет `undefined` (в старом -- `window`), из-за этого при чтении `this.waterAmount` возникнет ошибка! - -Её можно решить, если вызвать `getBoilTime` с явным указанием контекста: `getBoilTime.call(this)`: - -```js -//+ run -function CoffeeMachine(power) { - this.waterAmount = 0; - var WATER_HEAT_CAPACITY = 4200; - - function getBoilTime() { - return this.waterAmount * WATER_HEAT_CAPACITY * 80 / power; - } - - function onReady() { - alert( 'Кофе готово!' ); - } - - this.run = function() { -*!* - setTimeout(onReady, getBoilTime.call(this)); -*/!* - }; - -} - -// создаю кофеварку, мощностью 100000W чтобы кипятила быстро -var coffeeMachine = new CoffeeMachine(100000); -coffeeMachine.waterAmount = 200; - -coffeeMachine.run(); -``` - -Такой подход будет работать, но он не очень-то удобен. Ведь получается, что теперь везде, где мы хотим вызвать `getBoilTime`, нужно явно указывать контекст, т.е. писать `getBoilTime.call(this)`. - -К счастью существуют более элегантные решения. - -### Привязка через bind - -Можно при объявлении привязать `getBoilTime` к объекту через `bind`, тогда вопрос контекста отпадёт сам собой: - -```js -//+ run -function CoffeeMachine(power) { - this.waterAmount = 0; - - var WATER_HEAT_CAPACITY = 4200; - -*!* - var getBoilTime = function() { - return this.waterAmount * WATER_HEAT_CAPACITY * 80 / power; - }.bind(this); -*/!* - - function onReady() { - alert( 'Кофе готово!' ); - } - - this.run = function() { -*!* - setTimeout(onReady, getBoilTime()); -*/!* - }; - -} - -var coffeeMachine = new CoffeeMachine(100000); -coffeeMachine.waterAmount = 200; - -coffeeMachine.run(); -``` - -Это решение будет работать, теперь функцию можно просто вызывать без `call`. Но объявление функции стало менее красивым. - -### Сохранение this в замыкании - -Пожалуй, самый удобный и часто применяемый путь решения состоит в том, чтобы предварительно скопировать `this` во вспомогательную переменную и обращаться из внутренних функций уже к ней. - -Вот так: - -```js -//+ run -function CoffeeMachine(power) { - this.waterAmount = 0; - - var WATER_HEAT_CAPACITY = 4200; - -*!* - var self = this; - - function getBoilTime() { - return self.waterAmount * WATER_HEAT_CAPACITY * 80 / power; - } -*/!* - - function onReady() { - alert( 'Кофе готово!' ); - } - - this.run = function() { - setTimeout(onReady, getBoilTime()); - }; - -} - -var coffeeMachine = new CoffeeMachine(100000); -coffeeMachine.waterAmount = 200; - -coffeeMachine.run(); -``` - -Теперь `getBoilTime` получает `self` из замыкания. - -**Конечно, чтобы это работало, мы не должны изменять `self`, а все приватные методы, которые хотят иметь доступ к текущему объекту, должны использовать внутри себя `self` вместо `this`.** - -Вместо `self` можно использовать любое другое имя переменной, например `var me = this`. - -## Итого - -Итак, мы сделали кофеварку с публичными и приватными методами и заставили их корректно работать. - -В терминологии ООП отделение и защита внутреннего интерфейса называется [инкапсуляция](http://ru.wikipedia.org/wiki/%D0%98%D0%BD%D0%BA%D0%B0%D0%BF%D1%81%D1%83%D0%BB%D1%8F%D1%86%D0%B8%D1%8F_%28%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%29). - -Кратко перечислим бонусы, которые она даёт: - -
        -
        Защита пользователей от выстрела себе в ногу
        -
        Представьте, команда разработчиков пользуется кофеваркой. Кофеварка создана фирмой "Лучшие Кофеварки" и, в общем, работает хорошо, но с неё сняли защитный кожух и, таким образом, внутренний интерфейс стал доступен. - -Все разработчики цивилизованны -- и пользуются кофеваркой как обычно. Но хитрый Вася решил, что он самый умный, и подкрутил кое-что внутри кофеварки, чтобы кофе заваривался покрепче. Вася не знал, что те изменения, которые он произвёл, приведут к тому, что кофеварка испортится через два дня. - -Виноват, разумеется, не только Вася, но и тот, кто снял защитный кожух с кофеварки, и тем самым позволил Васе проводить манипуляции. - -В программировании -- то же самое. Если пользователь объекта будет менять то, что не рассчитано на изменение снаружи -- последствия могут быть непредсказуемыми. -
        -
        Удобство в поддержке
        -
        Ситуация в программировании сложнее, чем с кофеваркой, т.к. кофеварку один раз купили и всё, а программа может улучшаться и дорабатываться. - -**При наличии чётко выделенного внешнего интерфейса, разработчик может свободно менять внутренние свойства и методы, без оглядки на коллег.** - -Гораздо легче разрабатывать, если знаешь, что ряд методов (все внутренние) можно переименовывать, менять их параметры, и вообще, переписать как угодно, так как внешний код к ним абсолютно точно не обращается. - -Ближайшая аналогия в реальной жизни -- это когда выходит "новая версия" кофеварки, которая работает гораздо лучше. Разработчик мог переделать всё внутри, но пользоваться ей по-прежнему просто, так как внешний интерфейс сохранён.
        -
        Управление сложностью
        -
        Люди обожают пользоваться вещами, которые просты с виду. А что внутри -- дело десятое. - -Программисты здесь не исключение. - -**Всегда удобно, когда детали реализации скрыты, и доступен простой, понятно документированный внешний интерфейс.** -
        -
        - diff --git a/1-js/8-oop/2-internal-external-interface/coffee-inside.jpg b/1-js/8-oop/2-internal-external-interface/coffee-inside.jpg deleted file mode 100755 index 60f84664d1e1b6f46b856d5a781389c59af5b1ce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 61294 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

        w8NAK#`P3A%P-%W>`U+6eEW(RnjWa@1=HU{m^b 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 -

      • С приватными свойствами имя `firstName` и фамилия `surname`.
      • -
      • С сеттерами для этих свойств.
      • -
      • С геттером `getFullName()`, который возвращает полное имя.
      • -
      - -Должен работать так: - -```js -function User() { - /* ваш код */ -} - -var user = new User(); -user.setFirstName("Петя"); -user.setSurname("Иванов"); - -alert( user.getFullName() ); // Петя Иванов -``` - diff --git a/1-js/8-oop/3-getters-setters/2-getter-power/solution.md b/1-js/8-oop/3-getters-setters/2-getter-power/solution.md deleted file mode 100644 index b82c109a..00000000 --- a/1-js/8-oop/3-getters-setters/2-getter-power/solution.md +++ /dev/null @@ -1,28 +0,0 @@ - - -```js -function CoffeeMachine(power, capacity) { - //... - this.setWaterAmount = function(amount) { - if (amount < 0) { - throw new Error("Значение должно быть положительным"); - } - if (amount > capacity) { - throw new Error("Нельзя залить воды больше, чем " + capacity); - } - - waterAmount = amount; - }; - - this.getWaterAmount = function() { - return waterAmount; - }; - -*!* - this.getPower = function() { - return power; - }; -*/!* -} -``` - diff --git a/1-js/8-oop/3-getters-setters/2-getter-power/task.md b/1-js/8-oop/3-getters-setters/2-getter-power/task.md deleted file mode 100644 index 7301c6f5..00000000 --- a/1-js/8-oop/3-getters-setters/2-getter-power/task.md +++ /dev/null @@ -1,32 +0,0 @@ -# Добавить геттер для power - -[importance 5] - -Добавьте кофеварке геттер для приватного свойства `power`, чтобы внешний код мог узнать мощность кофеварки. - -Исходный код: - -```js -function CoffeeMachine(power, capacity) { - //... - this.setWaterAmount = function(amount) { - if (amount < 0) { - throw new Error("Значение должно быть положительным"); - } - if (amount > capacity) { - throw new Error("Нельзя залить воды больше, чем " + capacity); - } - - waterAmount = amount; - }; - - this.getWaterAmount = function() { - return waterAmount; - }; - -} -``` - -Обратим внимание, что ситуация, когда у свойства `power` есть геттер, но нет сеттера -- вполне обычна. - -Здесь это означает, что мощность `power` можно указать лишь при создании кофеварки и в дальнейшем её можно прочитать, но нельзя изменить. \ No newline at end of file diff --git a/1-js/8-oop/3-getters-setters/3-add-public-coffeemachine/solution.md b/1-js/8-oop/3-getters-setters/3-add-public-coffeemachine/solution.md deleted file mode 100644 index 41aa318a..00000000 --- a/1-js/8-oop/3-getters-setters/3-add-public-coffeemachine/solution.md +++ /dev/null @@ -1,47 +0,0 @@ -В решении ниже `addWater` будет просто вызывать `setWaterAmount`. - -```js -//+ run -function CoffeeMachine(power, capacity) { - var waterAmount = 0; - - var WATER_HEAT_CAPACITY = 4200; - - function getTimeToBoil() { - return waterAmount * WATER_HEAT_CAPACITY * 80 / power; - } - - this.setWaterAmount = function(amount) { - if (amount < 0) { - throw new Error("Значение должно быть положительным"); - } - if (amount > capacity) { - throw new Error("Нельзя залить больше, чем " + capacity); - } - - waterAmount = amount; - }; - -*!* - this.addWater = function(amount) { - this.setWaterAmount(waterAmount + amount); - }; -*/!* - - function onReady() { - alert( 'Кофе готов!' ); - } - - this.run = function() { - setTimeout(onReady, getTimeToBoil()); - }; - -} - -var coffeeMachine = new CoffeeMachine(100000, 400); -coffeeMachine.addWater(200); -coffeeMachine.addWater(100); -coffeeMachine.addWater(300); // Нельзя залить больше.. -coffeeMachine.run(); -``` - diff --git a/1-js/8-oop/3-getters-setters/3-add-public-coffeemachine/task.md b/1-js/8-oop/3-getters-setters/3-add-public-coffeemachine/task.md deleted file mode 100644 index e123fed4..00000000 --- a/1-js/8-oop/3-getters-setters/3-add-public-coffeemachine/task.md +++ /dev/null @@ -1,52 +0,0 @@ -# Добавить публичный метод кофеварке - -[importance 5] - -Добавьте кофеварке публичный метод `addWater(amount)`, который будет добавлять воду. - -При этом, конечно же, должны происходить все необходимые проверки -- на положительность и превышение ёмкости. - -Исходный код: - -```js -function CoffeeMachine(power, capacity) { - var waterAmount = 0; - - var WATER_HEAT_CAPACITY = 4200; - - function getTimeToBoil() { - return waterAmount * WATER_HEAT_CAPACITY * 80 / power; - } - - this.setWaterAmount = function(amount) { - if (amount < 0) { - throw new Error("Значение должно быть положительным"); - } - if (amount > capacity) { - throw new Error("Нельзя залить больше, чем " + capacity); - } - - waterAmount = amount; - }; - - function onReady() { - alert( 'Кофе готов!' ); - } - - this.run = function() { - setTimeout(onReady, getTimeToBoil()); - }; - -} -``` - -Вот такой код должен приводить к ошибке: - -```js -var coffeeMachine = new CoffeeMachine(100000, 400); -coffeeMachine.addWater(200); -coffeeMachine.addWater(100); -coffeeMachine.addWater(300); // Нельзя залить больше, чем 400 -coffeeMachine.run(); -``` - diff --git a/1-js/8-oop/3-getters-setters/4-setter-onready/solution.md b/1-js/8-oop/3-getters-setters/4-setter-onready/solution.md deleted file mode 100644 index 2aca1b6f..00000000 --- a/1-js/8-oop/3-getters-setters/4-setter-onready/solution.md +++ /dev/null @@ -1,69 +0,0 @@ - - -```js -//+ run -function CoffeeMachine(power, capacity) { - var waterAmount = 0; - - var WATER_HEAT_CAPACITY = 4200; - - function getTimeToBoil() { - return waterAmount * WATER_HEAT_CAPACITY * 80 / power; - } - - this.setWaterAmount = function(amount) { - // ... проверки пропущены для краткости - waterAmount = amount; - }; - - this.getWaterAmount = function(amount) { - return waterAmount; - }; - - function onReady() { - alert( 'Кофе готов!' ); - } - -*!* - this.setOnReady = function(newOnReady) { - onReady = newOnReady; - }; -*/!* - - this.run = function() { -*!* - setTimeout(function() { - onReady(); - }, getTimeToBoil()); -*/!* - }; - -} - -var coffeeMachine = new CoffeeMachine(20000, 500); -coffeeMachine.setWaterAmount(150); - -coffeeMachine.run(); - -*!* -coffeeMachine.setOnReady(function() { - var amount = coffeeMachine.getWaterAmount(); - alert( 'Готов кофе: ' + amount + 'мл' ); // Готов кофе: 150 мл -}); -*/!* -``` - -Обратите внимание на два момента в решении: -
        -
      1. В сеттере `setOnReady` параметр называется `newOnReady`. Мы не можем назвать его `onReady`, так как тогда изнутри сеттера мы никак не доберёмся до внешнего (старого значения): - -```js -// нерабочий вариант -this.setOnReady = function(onReady) { - onReady = onReady; // ??? внешняя переменная onReady недоступна -}; -``` - -
      2. -
      3. Чтобы `setOnReady` можно было вызывать в любое время, в `setTimeout` передаётся не `onReady`, а анонимная функция `function() { onReady() }`, которая возьмёт текущий (установленный последним) `onReady` из замыкания.
      4. -
      \ No newline at end of file diff --git a/1-js/8-oop/3-getters-setters/4-setter-onready/task.md b/1-js/8-oop/3-getters-setters/4-setter-onready/task.md deleted file mode 100644 index 2e960697..00000000 --- a/1-js/8-oop/3-getters-setters/4-setter-onready/task.md +++ /dev/null @@ -1,59 +0,0 @@ -# Создать сеттер для onReady - -[importance 5] - -Обычно когда кофе готов, мы хотим что-то сделать, например выпить его. - -Сейчас при готовности срабатывает функция `onReady`, но она жёстко задана в коде: - -```js -function CoffeeMachine(power, capacity) { - var waterAmount = 0; - - var WATER_HEAT_CAPACITY = 4200; - - function getTimeToBoil() { - return waterAmount * WATER_HEAT_CAPACITY * 80 / power; - } - - this.setWaterAmount = function(amount) { - // ... проверки пропущены для краткости - waterAmount = amount; - }; - - this.getWaterAmount = function(amount) { - return waterAmount; - }; - -*!* - function onReady() { - alert( 'Кофе готов!' ); - } -*/!* - - this.run = function() { - setTimeout(onReady, getTimeToBoil()); - }; - -} -``` - -Создайте сеттер `setOnReady`, чтобы код снаружи мог назначить свой `onReady`, вот так: - -```js -var coffeeMachine = new CoffeeMachine(20000, 500); -coffeeMachine.setWaterAmount(150); - -*!* -coffeeMachine.setOnReady(function() { - var amount = coffeeMachine.getWaterAmount(); - alert( 'Готов кофе: ' + amount + 'мл' ); // Кофе готов: 150 мл -}); -*/!* - -coffeeMachine.run(); -``` - -P.S. Значение `onReady` по умолчанию должно быть таким же, как и раньше. - -P.P.S. Постарайтесь сделать так, чтобы `setOnReady` можно было вызвать не только до, но и *после* запуска кофеварки, то есть чтобы функцию `onReady` можно было изменить в любой момент до её срабатывания. \ No newline at end of file diff --git a/1-js/8-oop/3-getters-setters/5-coffeemachine-add-isrunning/solution.md b/1-js/8-oop/3-getters-setters/5-coffeemachine-add-isrunning/solution.md deleted file mode 100644 index 8f61ff53..00000000 --- a/1-js/8-oop/3-getters-setters/5-coffeemachine-add-isrunning/solution.md +++ /dev/null @@ -1,62 +0,0 @@ -Код решения модифицирует функцию `run` и добавляет приватный идентификатор таймера `timerId`, по наличию которого мы судим о состоянии кофеварки: - -```js -//+ run -function CoffeeMachine(power, capacity) { - var waterAmount = 0; - -*!* - var timerId; - - this.isRunning = function() { - return !!timerId; - }; -*/!* - - var WATER_HEAT_CAPACITY = 4200; - - function getTimeToBoil() { - return waterAmount * WATER_HEAT_CAPACITY * 80 / power; - } - - this.setWaterAmount = function(amount) { - // ... проверки пропущены для краткости - waterAmount = amount; - }; - - this.getWaterAmount = function(amount) { - return waterAmount; - }; - - function onReady() { - alert( 'Кофе готов!' ); - } - - this.setOnReady = function(newOnReady) { - onReady = newOnReady; - }; - - this.run = function() { -*!* - timerId = setTimeout(function() { - timerId = null; - onReady(); - }, getTimeToBoil()); - }; -*/!* - -} - -var coffeeMachine = new CoffeeMachine(20000, 500); -coffeeMachine.setWaterAmount(100); - -alert( 'До: ' + coffeeMachine.isRunning() ); // До: false - -coffeeMachine.run(); -alert( 'В процессе: ' + coffeeMachine.isRunning() ); // В процессе: true - -coffeeMachine.setOnReady(function() { - alert( "После: " + coffeeMachine.isRunning() ); // После: false -}); -``` - diff --git a/1-js/8-oop/3-getters-setters/5-coffeemachine-add-isrunning/task.md b/1-js/8-oop/3-getters-setters/5-coffeemachine-add-isrunning/task.md deleted file mode 100644 index 7d8ff96c..00000000 --- a/1-js/8-oop/3-getters-setters/5-coffeemachine-add-isrunning/task.md +++ /dev/null @@ -1,25 +0,0 @@ -# Добавить метод isRunning - -[importance 5] - -Из внешнего кода мы хотели бы иметь возможность понять -- запущена кофеварка или нет. - -Для этого добавьте кофеварке публичный метод `isRunning()`, который будет возвращать `true`, если она запущена и `false`, если нет. - -Нужно, чтобы такой код работал: - -```js -var coffeeMachine = new CoffeeMachine(20000, 500); -coffeeMachine.setWaterAmount(100); - -alert( 'До: ' + coffeeMachine.isRunning() ); // До: false - -coffeeMachine.run(); -alert( 'В процессе: ' + coffeeMachine.isRunning() ); // В процессе: true - -coffeeMachine.setOnReady(function() { - alert( "После: " + coffeeMachine.isRunning() ); // После: false -}); -``` - -Исходный код возьмите из решения [предыдущей задачи](/task/setter-onready). \ No newline at end of file diff --git a/1-js/8-oop/3-getters-setters/article.md b/1-js/8-oop/3-getters-setters/article.md deleted file mode 100644 index e97a6e1b..00000000 --- a/1-js/8-oop/3-getters-setters/article.md +++ /dev/null @@ -1,167 +0,0 @@ -# Геттеры и сеттеры - -Для *управляемого* доступа к состоянию объекта используют специальные функции, так называемые "геттеры" и "сеттеры". -[cut] - -## Геттер и сеттер для воды - -На текущий момент количество воды в кофеварке является публичным свойством `waterAmount`: - -```js -//+ run -function CoffeeMachine(power) { - // количество воды в кофеварке - this.waterAmount = 0; - - ... -} -``` - -Это немного опасно. Ведь в это свойство можно записать произвольное количество воды, хоть весь мировой океан. - -```js -// не помещается в кофеварку! -coffeeMachine.waterAmount = 1000000; -``` - -Это ещё ничего, гораздо хуже, что можно наоборот -- вылить больше, чем есть: - -```js -// и не волнует, было ли там столько воды вообще! -coffeeMachine.waterAmount -= 1000000; -``` - -Так происходит потому, что свойство полностью доступно снаружи. - -Чтобы не было таких казусов, нам нужно ограничить контроль над свойством со стороны внешнего кода. - -**Для лучшего контроля над свойством его делают приватным, а запись значения осуществляется через специальный метод, который называют *"сеттер"* (setter method).** - -Типичное название для сеттера -- `setСвойство`, например, в случае с кофеваркой таким сеттером будет метод `setWaterAmount`: - -```js -//+ run -function CoffeeMachine(power, capacity) { // capacity - ёмкость кофеварки - var waterAmount = 0; - - var WATER_HEAT_CAPACITY = 4200; - - function getTimeToBoil() { - return waterAmount * WATER_HEAT_CAPACITY * 80 / power; - } - -*!* - // "умная" установка свойства - this.setWaterAmount = function(amount) { - if (amount < 0) { - throw new Error("Значение должно быть положительным"); - } - if (amount > capacity) { - throw new Error("Нельзя залить воды больше, чем " + capacity); - } - - waterAmount = amount; - }; -*/!* - - function onReady() { - alert( 'Кофе готов!' ); - } - - this.run = function() { - setTimeout(onReady, getTimeToBoil()); - }; - -} - -var coffeeMachine = new CoffeeMachine(1000, 500); -coffeeMachine.setWaterAmount(600); // упс, ошибка! -``` - -Теперь `waterAmount` -- внутреннее свойство, его можно записать (через сеттер), но, увы, нельзя прочитать. - -**Для того, чтобы дать возможность внешнему коду узнать его значение, создадим специальную функцию -- "геттер" (getter method).** - -Геттеры обычно имеют название вида `getСвойство`, в данном случае `getWaterAmount`: - -```js -//+ run -function CoffeeMachine(power, capacity) { - //... - this.setWaterAmount = function(amount) { - if (amount < 0) { - throw new Error("Значение должно быть положительным"); - } - if (amount > capacity) { - throw new Error("Нельзя залить воды больше, чем " + capacity); - } - - waterAmount = amount; - }; - -*!* - this.getWaterAmount = function() { - return waterAmount; - }; -*/!* -} - -var coffeeMachine = new CoffeeMachine(1000, 500); -coffeeMachine.setWaterAmount(450); -alert( coffeeMachine.getWaterAmount() ); // 450 -``` - -## Единый геттер-сеттер - -Для большего удобства иногда делают единый метод, который называется так же, как свойство и отвечает *и за запись и за чтение*. - -При вызове без параметров такой метод возвращает свойство, а при передаче параметра -- назначает его. - -Выглядит это так: - -```js -//+ run -function CoffeeMachine(power, capacity) { - var waterAmount = 0; - -*!* - this.waterAmount = function(amount) { -*/!* - // вызов без параметра, значит режим геттера, возвращаем свойство - if (!arguments.length) return waterAmount; - - // иначе режим сеттера - if (amount < 0) { - throw new Error("Значение должно быть положительным"); - } - if (amount > capacity) { - throw new Error("Нельзя залить воды больше, чем " + capacity); - } - - waterAmount = amount; - }; - -} - -var coffeeMachine = new CoffeeMachine(1000, 500); - -// пример использования -*!* -coffeeMachine.waterAmount(450); -alert( coffeeMachine.waterAmount() ); // 450 -*/!* -``` - -Единый геттер-сеттер используется реже, чем две отдельные функции, но в некоторых JavaScript-библиотеках, например [jQuery](http://jquery.com) и [D3](http://d3js.org) подобный подход принят на уровне концепта. - -## Итого - -
        -
      • Для большего контроля над присвоением и чтением значения, вместо свойства делают "функцию-геттер" и "функцию-сеттер", геттер возвращает значение, сеттер -- устанавливает.
      • -
      • Если свойство предназначено только для чтения, то может быть только геттер, только для записи -- только сеттер.
      • -
      • В качестве альтернативы паре геттер/сеттер применяют единую функцию, которая без аргументов ведёт себя как геттер, а с аргументом -- как сеттер.
      • -
      - -Также можно организовать геттеры/сеттеры для свойства, не меняя структуры кода, через [дескрипторы свойств](/descriptors-getters-setters). - - diff --git a/1-js/8-oop/5-functional-inheritance/1-coffeemachine-fix-run/solution.md b/1-js/8-oop/5-functional-inheritance/1-coffeemachine-fix-run/solution.md deleted file mode 100644 index 9f35452d..00000000 --- a/1-js/8-oop/5-functional-inheritance/1-coffeemachine-fix-run/solution.md +++ /dev/null @@ -1,15 +0,0 @@ -Изменения в методе `run`: - -```js -this.run = function() { -*!* - if (!this._enabled) { - throw new Error("Кофеварка выключена"); - } -*/!* - - setTimeout(onReady, 1000); -}; -``` - - diff --git a/1-js/8-oop/5-functional-inheritance/1-coffeemachine-fix-run/solution.view/index.html b/1-js/8-oop/5-functional-inheritance/1-coffeemachine-fix-run/solution.view/index.html deleted file mode 100755 index 053c8198..00000000 --- a/1-js/8-oop/5-functional-inheritance/1-coffeemachine-fix-run/solution.view/index.html +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - - - - - - - - - \ No newline at end of file diff --git a/1-js/8-oop/5-functional-inheritance/1-coffeemachine-fix-run/source.view/index.html b/1-js/8-oop/5-functional-inheritance/1-coffeemachine-fix-run/source.view/index.html deleted file mode 100755 index 6d287989..00000000 --- a/1-js/8-oop/5-functional-inheritance/1-coffeemachine-fix-run/source.view/index.html +++ /dev/null @@ -1,45 +0,0 @@ - - - - - - - - - - - - - - \ No newline at end of file diff --git a/1-js/8-oop/5-functional-inheritance/1-coffeemachine-fix-run/task.md b/1-js/8-oop/5-functional-inheritance/1-coffeemachine-fix-run/task.md deleted file mode 100644 index d90fce6a..00000000 --- a/1-js/8-oop/5-functional-inheritance/1-coffeemachine-fix-run/task.md +++ /dev/null @@ -1,21 +0,0 @@ -# Запускать только при включённой кофеварке - -[importance 5] - -В коде `CoffeeMachine` сделайте так, чтобы метод `run` выводил ошибку, если кофеварка выключена. - -В итоге должен работать такой код: - -```js -var coffeeMachine = new CoffeeMachine(10000); -coffeeMachine.run(); // ошибка, кофеварка выключена! -``` - -А вот так -- всё в порядке: - -```js -var coffeeMachine = new CoffeeMachine(10000); -coffeeMachine.enable(); -coffeeMachine.run(); // ...Кофе готов! -``` - diff --git a/1-js/8-oop/5-functional-inheritance/2-coffeemachine-disable-stop/solution.md b/1-js/8-oop/5-functional-inheritance/2-coffeemachine-disable-stop/solution.md deleted file mode 100644 index e69de29b..00000000 diff --git a/1-js/8-oop/5-functional-inheritance/2-coffeemachine-disable-stop/solution.view/index.html b/1-js/8-oop/5-functional-inheritance/2-coffeemachine-disable-stop/solution.view/index.html deleted file mode 100755 index 61ce8414..00000000 --- a/1-js/8-oop/5-functional-inheritance/2-coffeemachine-disable-stop/solution.view/index.html +++ /dev/null @@ -1,58 +0,0 @@ - - - - - - - - - - - - - - \ No newline at end of file diff --git a/1-js/8-oop/5-functional-inheritance/2-coffeemachine-disable-stop/task.md b/1-js/8-oop/5-functional-inheritance/2-coffeemachine-disable-stop/task.md deleted file mode 100644 index 298cd301..00000000 --- a/1-js/8-oop/5-functional-inheritance/2-coffeemachine-disable-stop/task.md +++ /dev/null @@ -1,16 +0,0 @@ -# Останавливать кофеварку при выключении - -[importance 5] - -Когда кофеварку выключают -- текущая варка кофе должна останавливаться. - -Например, следующий код кофе не сварит: - -```js -var coffeeMachine = new CoffeeMachine(10000); -coffeeMachine.enable(); -coffeeMachine.run(); -coffeeMachine.disable(); // остановит работу, ничего не выведет -``` - -Реализуйте это на основе решения [предыдущей задачи](/task/coffeemachine-fix-run). diff --git a/1-js/8-oop/5-functional-inheritance/3-inherit-fridge/solution.md b/1-js/8-oop/5-functional-inheritance/3-inherit-fridge/solution.md deleted file mode 100644 index 38957f28..00000000 --- a/1-js/8-oop/5-functional-inheritance/3-inherit-fridge/solution.md +++ /dev/null @@ -1,29 +0,0 @@ -Решение: - -```js -function Fridge(power) { - // унаследовать - Machine.apply(this, arguments); - - var food = []; // приватное свойство food - - this.addFood = function() { - if (!this._enabled) { - throw new Error("Холодильник выключен"); - } - if (food.length + arguments.length >= this._power / 100) { - throw new Error("Нельзя добавить, не хватает мощности"); - } - for (var i = 0; i < arguments.length; i++) { - food.push(arguments[i]); // добавить всё из arguments - } - }; - - this.getFood = function() { - // копируем еду в новый массив, чтобы манипуляции с ним не меняли food - return food.slice(); - }; - -} -``` - diff --git a/1-js/8-oop/5-functional-inheritance/3-inherit-fridge/task.md b/1-js/8-oop/5-functional-inheritance/3-inherit-fridge/task.md deleted file mode 100644 index 150bdb0f..00000000 --- a/1-js/8-oop/5-functional-inheritance/3-inherit-fridge/task.md +++ /dev/null @@ -1,67 +0,0 @@ -# Унаследуйте холодильник - -[importance 4] - -Создайте класс для холодильника `Fridge(power)`, наследующий от `Machine`, с приватным свойством `food` и методами `addFood(...)`, `getFood()`: -
        -
      • Приватное свойство `food` хранит массив еды.
      • -
      • Публичный метод `addFood(item)` добавляет в массив `food` новую еду, доступен вызов с несколькими аргументами `addFood(item1, item2...)` для добавления нескольких элементов сразу.
      • -
      • Если холодильник выключен, то добавить еду нельзя, будет ошибка.
      • -
      • Максимальное количество еды ограничено `power/100`, где `power` -- мощность холодильника, указывается в конструкторе. При попытке добавить больше -- будет ошибка
      • -
      • Публичный метод `getFood()` возвращает еду в виде массива, добавление или удаление элементов из которого не должно влиять на свойство `food` холодильника.
      • -
      - -Код для проверки: - -```js -var fridge = new Fridge(200); -fridge.addFood("котлета"); // ошибка, холодильник выключен -``` - -Ещё код для проверки: - -```js -// создать холодильник мощностью 500 (не более 5 еды) -var fridge = new Fridge(500); -fridge.enable(); -fridge.addFood("котлета"); -fridge.addFood("сок", "зелень"); -fridge.addFood("варенье", "пирог", "торт"); // ошибка, слишком много еды -``` - -Код использования холодильника без ошибок: - -```js -var fridge = new Fridge(500); -fridge.enable(); -fridge.addFood("котлета"); -fridge.addFood("сок", "варенье"); - -var fridgeFood = fridge.getFood(); -alert( fridgeFood ); // котлета, сок, варенье - -// добавление элементов не влияет на еду в холодильнике -fridgeFood.push("вилка", "ложка"); - -alert( fridge.getFood() ); // внутри по-прежнему: котлета, сок, варенье -``` - -Исходный код класса `Machine`, от которого нужно наследовать: - -```js -function Machine(power) { - this._power = power; - this._enabled = false; - - var self = this; - - this.enable = function() { - self._enabled = true; - }; - - this.disable = function() { - self._enabled = false; - }; -} -``` - diff --git a/1-js/8-oop/5-functional-inheritance/4-add-methods-fridge/solution.md b/1-js/8-oop/5-functional-inheritance/4-add-methods-fridge/solution.md deleted file mode 100644 index e7752658..00000000 --- a/1-js/8-oop/5-functional-inheritance/4-add-methods-fridge/solution.md +++ /dev/null @@ -1,89 +0,0 @@ - - -```js -//+ run -function Machine(power) { - this._power = power; - this._enabled = false; - - var self = this; - - this.enable = function() { - self._enabled = true; - }; - - this.disable = function() { - self._enabled = false; - }; -} - -function Fridge(power) { - // унаследовать - Machine.apply(this, arguments); - - var food = []; // приватное свойство food - - this.addFood = function() { - if (!this._enabled) { - throw new Error("Холодильник выключен"); - } - if (food.length + arguments.length >= this._power / 100) { - throw new Error("Нельзя добавить, не хватает мощности"); - } - for (var i = 0; i < arguments.length; i++) { - food.push(arguments[i]); // добавить всё из arguments - } - - }; - - this.getFood = function() { - // копируем еду в новый массив, чтобы манипуляции с ним не меняли food - return food.slice(); - }; - -*!* - this.filterFood = function(filter) { - return food.filter(filter); - }; - - this.removeFood = function(item) { - var idx = food.indexOf(item); - if (idx != -1) food.splice(idx, 1); - }; -*/!* -} - -var fridge = new Fridge(500); -fridge.enable(); -fridge.addFood({ - title: "котлета", - calories: 100 -}); -fridge.addFood({ - title: "сок", - calories: 30 -}); -fridge.addFood({ - title: "зелень", - calories: 10 -}); -fridge.addFood({ - title: "варенье", - calories: 150 -}); - -var dietItems = fridge.filterFood(function(item) { - return item.calories < 50; -}); - -fridge.removeFood("нет такой еды"); // без эффекта -alert( fridge.getFood().length ); // 4 - -dietItems.forEach(function(item) { - alert( item.title ); // сок, зелень - fridge.removeFood(item); -}); - -alert( fridge.getFood().length ); // 2 -``` - diff --git a/1-js/8-oop/5-functional-inheritance/4-add-methods-fridge/task.md b/1-js/8-oop/5-functional-inheritance/4-add-methods-fridge/task.md deleted file mode 100644 index 46a4db21..00000000 --- a/1-js/8-oop/5-functional-inheritance/4-add-methods-fridge/task.md +++ /dev/null @@ -1,48 +0,0 @@ -# Добавьте методы в холодильник - -[importance 5] - -Добавьте в холодильник методы: -
        -
      • Публичный метод `filterFood(func)`, который возвращает всю еду, для которой `func(item) == true`
      • -
      • Публичный метод `removeFood(item)`, который удаляет еду `item` из холодильника.
      • -
      - -Код для проверки: - -```js -var fridge = new Fridge(500); -fridge.enable(); -fridge.addFood({ - title: "котлета", - calories: 100 -}); -fridge.addFood({ - title: "сок", - calories: 30 -}); -fridge.addFood({ - title: "зелень", - calories: 10 -}); -fridge.addFood({ - title: "варенье", - calories: 150 -}); - -fridge.removeFood("нет такой еды"); // без эффекта -alert( fridge.getFood().length ); // 4 - -var dietItems = fridge.filterFood(function(item) { - return item.calories < 50; -}); - -dietItems.forEach(function(item) { - alert( item.title ); // сок, зелень - fridge.removeFood(item); -}); - -alert( fridge.getFood().length ); // 2 -``` - -В качестве исходного кода используйте решение [предыдущей задачи](/task/inherit-fridge). diff --git a/1-js/8-oop/5-functional-inheritance/5-override-disable/solution.md b/1-js/8-oop/5-functional-inheritance/5-override-disable/solution.md deleted file mode 100644 index ec5fbb18..00000000 --- a/1-js/8-oop/5-functional-inheritance/5-override-disable/solution.md +++ /dev/null @@ -1,68 +0,0 @@ - - -```js -//+ run -function Machine(power) { - this._power = power; - this._enabled = false; - - var self = this; - - this.enable = function() { - self._enabled = true; - }; - - this.disable = function() { - self._enabled = false; - }; -} - -function Fridge(power) { - Machine.apply(this, arguments); - - var food = []; // приватное свойство food - - this.addFood = function() { - if (!this._enabled) { - throw new Error("Холодильник выключен"); - } - if (food.length + arguments.length >= this._power / 100) { - throw new Error("Нельзя добавить, не хватает мощности"); - } - for (var i = 0; i < arguments.length; i++) { - food.push(arguments[i]); // добавить всё из arguments - } - - }; - - this.getFood = function() { - // копируем еду в новый массив, чтобы манипуляции с ним не меняли food - return food.slice(); - }; - - this.filterFood = function(filter) { - return food.filter(filter); - }; - - this.removeFood = function(item) { - var idx = food.indexOf(item); - if (idx != -1) food.splice(idx, 1); - }; - -*!* - var parentDisable = this.disable; - this.disable = function() { - if (food.length) { - throw new Error("Нельзя выключить: внутри еда"); - } - parentDisable(); - }; -*/!* -} - -var fridge = new Fridge(500); -fridge.enable(); -fridge.addFood("кус-кус"); -fridge.disable(); // ошибка, в холодильнике есть еда -``` - diff --git a/1-js/8-oop/5-functional-inheritance/5-override-disable/task.md b/1-js/8-oop/5-functional-inheritance/5-override-disable/task.md deleted file mode 100644 index 482ffaaa..00000000 --- a/1-js/8-oop/5-functional-inheritance/5-override-disable/task.md +++ /dev/null @@ -1,17 +0,0 @@ -# Переопределите disable - -[importance 5] - -Переопределите метод `disable` холодильника, чтобы при наличии в нём еды он выдавал ошибку. - - -Код для проверки: - -```js -var fridge = new Fridge(500); -fridge.enable(); -fridge.addFood("кус-кус"); -fridge.disable(); // ошибка, в холодильнике есть еда -``` - -В качестве исходного кода используйте решение [предыдущей задачи](/task/add-methods-fridge). diff --git a/1-js/8-oop/5-functional-inheritance/article.md b/1-js/8-oop/5-functional-inheritance/article.md deleted file mode 100644 index 3afd5a93..00000000 --- a/1-js/8-oop/5-functional-inheritance/article.md +++ /dev/null @@ -1,403 +0,0 @@ -# Функциональное наследование - -Наследование -- это создание новых "классов" на основе существующих. - -В JavaScript его можно реализовать несколькими путями, один из которых -- с использованием наложения конструкторов, мы рассмотрим в этой главе. -[cut] - -## Зачем наследование? - -Ранее мы обсуждали различные реализации кофеварки. Продолжим эту тему далее. - -Хватит ли нам только кофеварки для удобной жизни? Вряд ли... Скорее всего, ещё понадобятся как минимум холодильник, микроволновка, а возможно и другие *машины*. - -В реальной жизни у этих *машин* есть базовые правила пользования. Например, большая кнопка -- включение, шнур с розеткой нужно воткнуть в питание и т.п. - -Можно сказать, что "у всех машин есть общие свойства, а конкретные машины могут их дополнять". - -Именно поэтому, увидев новую технику, мы уже можем что-то с ней сделать, даже не читая инструкцию. - -Механизм наследования позволяет определить базовый класс `Машина`, в нём описать то, что свойственно всем машинам, а затем на его основе построить другие, более конкретные: `Кофеварка`, `Холодильник` и т.п. - -[smart header="В веб-разработке всё так же"] -В веб-разработке нам могут понадобиться классы `Меню`, `Табы`, `Диалог` и другие компоненты интерфейса. В них всех обычно есть что-то общее. - -Можно выделить такой общий функционал в класс `Компонент` и наследовать их от него, чтобы не дублировать код. -[/smart] - -## Наследование от Machine - -Базовый класс "машина" `Machine` будет реализовывать общего вида методы "включить" `enable()` и "выключить" `disable()`: - -```js -function Machine() { - var enabled = false; - - this.enable = function() { - enabled = true; - }; - - this.disable = function() { - enabled = false; - }; -} -``` - -Унаследуем от него кофеварку. При этом она получит эти методы автоматически: - -```js -function CoffeeMachine(power) { -*!* - Machine.call(this); // отнаследовать -*/!* - - var waterAmount = 0; - - this.setWaterAmount = function(amount) { - waterAmount = amount; - }; - -} - -var coffeeMachine = new CoffeeMachine(10000); - -*!* -coffeeMachine.enable(); -coffeeMachine.setWaterAmount(100); -coffeeMachine.disable(); -*/!* -``` - -Наследование реализовано вызовом `Machine.call(this)` в начале конструктора `CoffeeMachine`. - -Он вызывает функцию `Machine`, передавая ей в качестве контекста `this` текущий объект. `Machine`, в процессе выполнения, записывает в `this` различные полезные свойства и методы, в нашем случае `this.enable` и `this.disable`. - -Далее конструктор `CoffeeMachine` продолжает выполнение и может добавить свои свойства и методы. - -В результате мы получаем объект `coffeeMachine`, который включает в себя методы из `Machine` и `CoffeeMachine`. - -## Защищённые свойства - -В коде выше есть одна проблема. - -**Наследник не имеет доступа к приватным свойствам родителя.** - -Иначе говоря, если кофеварка захочет обратиться к `enabled`, то её ждёт разочарование: - -```js -//+ run -function Machine() { - var enabled = false; - - this.enable = function() { - enabled = true; - }; - - this.disable = function() { - enabled = false; - }; -} - -function CoffeeMachine(power) { - Machine.call(this); - - this.enable(); - -*!* - // ошибка, переменная не определена! - alert( enabled ); -*/!* -} - -var coffeeMachine = new CoffeeMachine(10000); -``` - -Это естественно, ведь `enabled` -- локальная переменная функции `Machine`. Она находится в другой области видимости. - -**Чтобы наследник имел доступ к свойству, оно должно быть записано в `this`.** - -При этом, чтобы обозначить, что свойство является внутренним, его имя начинают с подчёркивания `_`. - -```js -//+ run -function Machine() { -*!* - this._enabled = false; // вместо var enabled -*/!* - - this.enable = function() { - this._enabled = true; - }; - - this.disable = function() { - this._enabled = false; - }; -} - -function CoffeeMachine(power) { - Machine.call(this); - - this.enable(); - -*!* - alert( this._enabled ); // true -*/!* -} - -var coffeeMachine = new CoffeeMachine(10000); -``` - -Подчёркивание в начале свойства -- общепринятый знак, что свойство является внутренним, предназначенным лишь для доступа из самого объекта и его наследников. Такие свойства называют *защищёнными*. - -Технически, залезть в него из внешнего кода, конечно, возможно, но приличный программист так делать не будет. - -## Перенос свойства в защищённые - -У `CoffeeMachine` есть приватное свойство `power`. Сейчас мы его тоже сделаем защищённым и перенесём в `Machine`, поскольку "мощность" свойственна всем машинам, а не только кофеварке. - -```js -//+ run -function Machine(power) { -*!* - this._power = power; // (1) -*/!* - - this._enabled = false; - - this.enable = function() { - this._enabled = true; - }; - - this.disable = function() { - this._enabled = false; - }; -} - -function CoffeeMachine(power) { -*!* - Machine.apply(this, arguments); // (2) -*/!* - - alert( this._enabled ); // false - alert( this._power ); // 10000 -} - -var coffeeMachine = new CoffeeMachine(10000); -``` - -Теперь все машины `Machine` имеют мощность `power`. Обратим внимание, что мы из параметра конструктора сразу скопировали её в объект в строке `(1)`. Иначе она была бы недоступна из наследников. - -В строке `(2)` мы теперь вызываем не просто `Machine.call(this)`, а расширенный вариант: `Machine.apply(this, arguments)`, который вызывает `Machine` в текущем контексте вместе с передачей текущих аргументов. - -Можно было бы использовать и более простой вызов `Machine.call(this, power)`, но использование `apply` гарантирует передачу всех аргументов, вдруг их количество увеличится -- не надо будет переписывать. - -## Переопределение методов - -Итак, мы получили класс `CoffeeMachine`, который наследует от `Machine`. - -Аналогичным образом мы можем унаследовать от `Machine` холодильник `Fridge`, микроволновку `MicroOven` и другие классы, которые разделяют общий "машинный" функционал, то есть имеют мощность и их можно включать/выключать. - -Для этого достаточно вызвать `Machine` текущем контексте, а затем добавить свои методы. - -```js -// Fridge может добавить и свои аргументы, -// которые в Machine не будут использованы -function Fridge(power, temperature) { - Machine.apply(this, arguments); - - // ... -} -``` - -Бывает так, что реализация конкретного метода машины в наследнике имеет свои особенности. - -Можно, конечно, объявить в `CoffeeMachine` свой `enable`: - -```js -function CoffeeMachine(power, capacity) { - Machine.apply(this, arguments); - - // переопределить this.enable - this.enable = function() { - /* enable для кофеварки */ - }; -} -``` - -...Однако, как правило, мы хотим не заменить, а *расширить* метод родителя, добавить к нему что-то. Например, сделать так, чтобы при включении кофеварка тут же запускалась. - -Для этого метод родителя предварительно копируют в переменную, и затем вызывают внутри нового `enable` -- там, где считают нужным: - -```js -function CoffeeMachine(power) { - Machine.apply(this, arguments); - -*!* - var parentEnable = this.enable; // (1) - this.enable = function() { // (2) - parentEnable.call(this); // (3) - this.run(); // (4) - } -*/!* - - ... -} -``` - -**Общая схема переопределения метода (по строкам выделенного фрагмента кода):** - -
        -
      1. Копируем доставшийся от родителя метод `this.enable` в переменную, например `parentEnable`.
      2. -
      3. Заменяем `this.enable` на свою функцию...
      4. -
      5. ...Которая по-прежнему реализует старый функционал через вызов `parentEnable`.
      6. -
      7. ...И в дополнение к нему делает что-то своё, например запускает приготовление кофе.
      8. -
      - -Обратим внимание на строку `(3)`. - -В ней родительский метод вызывается так: `parentEnable.call(this)`. Если бы вызов был таким: `parentEnable()`, то ему бы не передался текущий `this` и возникла бы ошибка. - -Технически, можно сделать возможность вызывать его и как `parentEnable()`, но тогда надо гарантировать, что контекст будет правильным, например привязать его при помощи `bind` или при объявлении, в родителе, вообще не использовать `this`, а получать контекст через замыкание, вот так: - -```js -//+ run -function Machine(power) { - this._enabled = false; - -*!* - var self = this; -*/!* - - this.enable = function() { -*!* - // используем внешнюю переменную вместо this - self._enabled = true; -*/!* - }; - - this.disable = function() { - self._enabled = false; - }; - -} - -function CoffeeMachine(power) { - Machine.apply(this, arguments); - - var waterAmount = 0; - - this.setWaterAmount = function(amount) { - waterAmount = amount; - }; - -*!* - var parentEnable = this.enable; - this.enable = function() { - parentEnable(); // теперь можно вызывать как угодно, this не важен - this.run(); - } -*/!* - - function onReady() { - alert( 'Кофе готово!' ); - } - - this.run = function() { - setTimeout(onReady, 1000); - }; - -} - -var coffeeMachine = new CoffeeMachine(10000); -coffeeMachine.setWaterAmount(50); -coffeeMachine.enable(); -``` - -В коде выше родительский метод `parentEnable = this.enable` успешно продолжает работать даже при вызове без контекста. А всё потому, что использует `self` внутри. - -## Итого - -Организация наследования, которая описана в этой главе, называется "функциональным паттерном наследования". - -Её общая схема (кратко): - -
        -
      1. Объявляется конструктор родителя `Machine`. В нём могут быть приватные (private), публичные (public) и защищённые (protected) свойства: - -```js -function Machine(params) { - // локальные переменные и функции доступны только внутри Machine - var privateProperty; - - // публичные доступны снаружи - this.publicProperty = ...; - - // защищённые доступны внутри Machine и для потомков - // мы договариваемся не трогать их снаружи - this._protectedProperty = ... -} - -var machine = new Machine(...) -machine.public(); -``` - -
      2. -
      3. Для наследования конструктор потомка вызывает родителя в своём контексте через `apply`. После чего может добавить свои переменные и методы: - -```js -function CoffeeMachine(params) { - // универсальный вызов с передачей любых аргументов -*!* - Machine.apply(this, arguments); -*/!* - - this.coffeePublicProperty = ... -} - -var coffeeMachine = new CoffeeMachine(...); -coffeeMachine.publicProperty(); -coffeeMachine.coffeePublicProperty(); -``` - -
      4. -
      5. В `CoffeeMachine` свойства, полученные от родителя, можно перезаписать своими. Но обычно требуется не заменить, а расширить метод родителя. Для этого он предварительно копируется в переменную: - -```js -function CoffeeMachine(params) { - Machine.apply(this, arguments); - -*!* - var parentProtected = this._protectedProperty; - this._protectedProperty = function(args) { - parentProtected.apply(this, args); // (*) - // ... - }; -*/!* -} -``` - -Строку `(*)` можно упростить до `parentProtected(args)`, если метод родителя не использует `this`, а, например, привязан к `var self = this`: - -```js -function Machine(params) { - var self = this; - - this._protected = function() { - self.property = "value"; - }; -} -``` - -
      6. -
      - -Надо сказать, что способ наследования, описанный в этой главе, используется нечасто. - -В следующих главах мы будем изучать прототипный подход, который обладаем рядом преимуществ. - -Но знать и понимать его необходимо, поскольку во многих существующих библиотеках классы написаны в функциональном стиле, и расширять/наследовать от них можно только так. - - - - - diff --git a/1-js/8-oop/index.md b/1-js/8-oop/index.md deleted file mode 100644 index 292b2d77..00000000 --- a/1-js/8-oop/index.md +++ /dev/null @@ -1,3 +0,0 @@ -# ООП в функциональном стиле - -Инкапсуляция и наследование в функциональном стиле, а также расширенные возможности объектов JavaScript. \ No newline at end of file diff --git a/1-js/9-prototypes/1-prototype/1-property-after-delete/solution.md b/1-js/9-prototypes/1-prototype/1-property-after-delete/solution.md deleted file mode 100644 index f6308c17..00000000 --- a/1-js/9-prototypes/1-prototype/1-property-after-delete/solution.md +++ /dev/null @@ -1,5 +0,0 @@ -
        -
      1. `true`, свойство взято из `rabbit`.
      2. -
      3. `null`, свойство взято из `animal`.
      4. -
      5. `undefined`, свойства больше нет.
      6. -
      \ No newline at end of file diff --git a/1-js/9-prototypes/1-prototype/1-property-after-delete/task.md b/1-js/9-prototypes/1-prototype/1-property-after-delete/task.md deleted file mode 100644 index 70b4e3ba..00000000 --- a/1-js/9-prototypes/1-prototype/1-property-after-delete/task.md +++ /dev/null @@ -1,28 +0,0 @@ -# Чему равно cвойство после delete? - -[importance 5] - -Какие значения будут выводиться в коде ниже? - -```js -var animal = { - jumps: null -}; -var rabbit = { - jumps: true -}; - -rabbit.__proto__ = animal; - -alert( rabbit.jumps ); // ? (1) - -delete rabbit.jumps; - -alert( rabbit.jumps ); // ? (2) - -delete animal.jumps; - -alert( rabbit.jumps ); // ? (3) -``` - -Итого три вопроса. \ No newline at end of file diff --git a/1-js/9-prototypes/1-prototype/2-proto-and-this/proto5.png b/1-js/9-prototypes/1-prototype/2-proto-and-this/proto5.png deleted file mode 100755 index 055a44476af85f4a0a99d796e9da49a5b60d58b4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2059 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 ZMzjt#Ev&2S#Qp;S{OCak?s`Y_{sk|3TSfo? diff --git a/1-js/9-prototypes/1-prototype/2-proto-and-this/solution.md b/1-js/9-prototypes/1-prototype/2-proto-and-this/solution.md deleted file mode 100644 index 4206298f..00000000 --- a/1-js/9-prototypes/1-prototype/2-proto-and-this/solution.md +++ /dev/null @@ -1,18 +0,0 @@ -**Ответ: свойство будет записано в `rabbit`.** - -Если коротко -- то потому что `this` будет указывать на `rabbit`, а прототип при записи не используется. - -Если в деталях -- посмотрим как выполняется `rabbit.eat()`: -
        -
      1. Интерпретатор ищет `rabbit.eat`, чтобы его вызвать. Но свойство `eat` отсутствует в объекте `rabbit`, поэтому он идет по ссылке `rabbit.__proto__` и находит это свойство там. - -
      2. -
      3. Функция `eat` запускается. Контекст ставится равным объекту перед точкой, т.е. `this = rabbit`. - -Итак -- получается, что команда `this.full = true` устанавливает свойство `full` в самом объекте `rabbit`. Итог: - - -
      4. -
      - -Эта задача демонстрирует, что несмотря на то, в каком прототипе находится свойство, это никак не влияет на установку `this`, которая осуществляется по своим, независимым правилам. \ No newline at end of file diff --git a/1-js/9-prototypes/1-prototype/2-proto-and-this/task.md b/1-js/9-prototypes/1-prototype/2-proto-and-this/task.md deleted file mode 100644 index 346de8e1..00000000 --- a/1-js/9-prototypes/1-prototype/2-proto-and-this/task.md +++ /dev/null @@ -1,24 +0,0 @@ -# Прототип и this - -[importance 5] - -Сработает ли вызов `rabbit.eat()` ? - -Если да, то в какой именно объект он запишет свойство `full`: в `rabbit` или `animal`? - -```js -var animal = { - eat: function() { - this.full = true; - } -}; - -var rabbit = { - __proto__: animal -}; - -*!* -rabbit.eat(); -*/!* -``` - diff --git a/1-js/9-prototypes/1-prototype/3-search-algorithm/solution.md b/1-js/9-prototypes/1-prototype/3-search-algorithm/solution.md deleted file mode 100644 index 60ba9501..00000000 --- a/1-js/9-prototypes/1-prototype/3-search-algorithm/solution.md +++ /dev/null @@ -1,33 +0,0 @@ -
        -
      1. Расставим `__proto__`: - -```js -//+ run -var head = { - glasses: 1 -}; - -var table = { - pen: 3 -}; -table.__proto__ = head; - -var bed = { - sheet: 1, - pillow: 2 -}; -bed.__proto__ = table; - -var pockets = { - money: 2000 -}; -pockets.__proto__ = bed; - -alert( pockets.pen ); // 3 -alert( bed.glasses ); // 1 -alert( table.money ); // undefined -``` - -
      2. -
      3. **В современных браузерах, с точки зрения производительности, нет разницы, брать свойство из объекта или прототипа.** Они запоминают, где было найдено свойство и в следующий раз при запросе, к примеру, `pockets.glasses` начнут искать сразу в прототипе (`head`).
      4. -
      \ No newline at end of file diff --git a/1-js/9-prototypes/1-prototype/3-search-algorithm/task.md b/1-js/9-prototypes/1-prototype/3-search-algorithm/task.md deleted file mode 100644 index ab5f9f16..00000000 --- a/1-js/9-prototypes/1-prototype/3-search-algorithm/task.md +++ /dev/null @@ -1,32 +0,0 @@ -# Алгоритм для поиска - -[importance 5] - -Есть объекты: - -```js -var head = { - glasses: 1 -}; - -var table = { - pen: 3 -}; - -var bed = { - sheet: 1, - pillow: 2 -}; - -var pockets = { - money: 2000 -}; -``` - -Задание состоит из двух частей: -
        -
      1. Присвойте объектам ссылки `__proto__` так, чтобы любой поиск чего-либо шёл по алгоритму `pockets -> bed -> table -> head`. - -То есть `pockets.pen == 3`, `bed.glasses == 1`, но `table.money == undefined`.
      2. -
      3. После этого ответьте на вопрос, как быстрее искать `glasses`: обращением к `pockets.glasses` или `head.glasses`? Попробуйте протестировать.
      4. -
      diff --git a/1-js/9-prototypes/1-prototype/article.md b/1-js/9-prototypes/1-prototype/article.md deleted file mode 100644 index 3d83be6a..00000000 --- a/1-js/9-prototypes/1-prototype/article.md +++ /dev/null @@ -1,246 +0,0 @@ -# Прототип объекта - -Объекты в JavaScript можно организовать в цепочки так, чтобы свойство, не найденное в одном объекте, автоматически искалось бы в другом. - -Связующим звеном выступает специальное свойство `__proto__`. - -[cut] -## Прототип __proto__ - -Если один объект имеет специальную ссылку `__proto__` на другой объект, то при чтении свойства из него, если свойство отсутствует в самом объекте, оно ищется в объекте `__proto__`. - -Свойство `__proto__` доступно во всех браузерах, кроме IE10-, а в более старых IE оно, конечно же, тоже есть, но напрямую к нему не обратиться, требуются чуть более сложные способы, которые мы рассмотрим позднее. - -Пример кода (кроме IE10-): - -```js -//+ run -var animal = { - eats: true -}; -var rabbit = { - jumps: true -}; - -*!* -rabbit.__proto__ = animal; -*/!* - -// в rabbit можно найти оба свойства -alert( rabbit.jumps ); // true -alert( rabbit.eats ); // true -``` - -
        -
      1. Первый `alert` здесь работает очевидным образом -- он выводит свойство `jumps` объекта `rabbit`.
      2. -
      3. Второй `alert` хочет вывести `rabbit.eats`, ищет его в самом объекте `rabbit`, не находит -- и продолжает поиск в объекте `rabbit.__proto__`, то есть, в данном случае, в `animal`.
      4. -
      - -Иллюстрация происходящего при чтении `rabbit.eats` (поиск идет снизу вверх): - - - -**Объект, на который указывает ссылка `__proto__`, называется *"прототипом"*. В данном случае получилось, что `animal` является прототипом для `rabbit`.** - -**Также говорят, что объект `rabbit` *"прототипно наследует"* от `animal`.** - -Обратим внимание -- прототип используется исключительно при чтении. Запись значения, например, `rabbit.eats = value` или удаление `delete rabbit.eats` -- работает напрямую с объектом. - -В примере ниже мы записываем свойство в сам `rabbit`, после чего `alert` перестаёт брать его у прототипа, а берёт уже из самого объекта: - -```js -//+ run -var animal = { - eats: true -}; -var rabbit = { - jumps: true, - eats: false -}; - -rabbit.__proto__ = animal; - -*!* -alert( rabbit.eats ); // false, свойство взято из rabbit -*/!* -``` - -**Другими словами, прототип -- это "резервное хранилище свойств и методов" объекта, автоматически используемое при поиске.** - -У объекта, который является `__proto__`, может быть свой `__proto__`, у того -- свой, и так далее. При этом свойства будут искаться по цепочке. - -[smart header="Ссылка __proto__ в спецификации"] -Если вы будете читать спецификацию EcmaScript -- свойство `__proto__` обозначено в ней как `[[Prototype]]`. - -Двойные квадратные скобки здесь важны, чтобы не перепутать его с совсем другим свойством, которое называется `prototype`, и которое мы рассмотрим позже. -[/smart] - - -## Метод hasOwnProperty - -Обычный цикл `for..in` не делает различия между свойствами объекта и его прототипа. - -Он перебирает всё, например: - -```js -//+ run -var animal = { - eats: true -}; - -var rabbit = { - jumps: true, - __proto__: animal -}; - -*!* -for (var key in rabbit) { - alert( key + " = " + rabbit[key] ); // выводит и "eats" и "jumps" -} -*/!* -``` - -Иногда хочется посмотреть, что находится именно в самом объекте, а не в прототипе. - -**Вызов [obj.hasOwnProperty(prop)](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/HasOwnProperty) возвращает `true`, если свойство `prop` принадлежит самому объекту `obj`, иначе `false`.** - -Например: - -```js -//+ run -var animal = { - eats: true -}; - -var rabbit = { - jumps: true, - __proto__: animal -}; - -*!* -alert( rabbit.hasOwnProperty('jumps') ); // true: jumps принадлежит rabbit - -alert( rabbit.hasOwnProperty('eats') ); // false: eats не принадлежит -*/!* -``` - -Для того, чтобы перебрать свойства самого объекта, достаточно профильтровать `key` через `hasOwnProperty`: - -```js -//+ run -var animal = { - eats: true -}; - -var rabbit = { - jumps: true, - __proto__: animal -}; - -for (var key in rabbit) { -*!* - if (!rabbit.hasOwnProperty(key)) continue; // пропустить "не свои" свойства -*/!* - alert( key + " = " + rabbit[key] ); // выводит только "jumps" -} -``` - -## Object.create(null) - -Зачастую объекты используют для хранения произвольных значений по ключу, как коллекцию: - -```js -var data = {}; -data.text = "Привет"; -data.age = 35; -// ... -``` - -При дальнейшем поиске в этой коллекции мы найдём не только `text` и `age`, но и встроенные функции: - -```js -//+ run -var data = {}; -alert(data.toString); // функция, хотя мы её туда не записывали -``` - -Это может быть неприятным сюрпризом и приводить к ошибкам, если названия свойств приходят от посетителя и могут быть произвольными. - -Чтобы этого избежать, мы можем исключать свойства, не принадлежащие самому объекту: -```js -//+ run -var data = {}; - -// выведет toString только если оно записано в сам объект -alert(data.hasOwnProperty('toString') ? data.toString : undefined); -``` - -Однако, есть путь и проще: -```js -//+ run -*!* -var data = Object.create(null); -*/!* -data.text = "Привет"; - -alert(data.text); // Привет -*!* -alert(data.toString); // undefined -*/!* -``` - -Объект, создаваемый при помощи `Object.create(null)` не имеет прототипа, а значит в нём нет лишних свойств. Для коллекции -- как раз то, что надо. - - -## Методы для работы с __proto__ - -В современных браузерах есть два дополнительных метода для работы с `__proto__`. Зачем они нужны, если есть `__proto__`? В общем-то, не очень нужны, но по историческим причинам тоже существуют. - -
      -
      Чтение: [Object.getPrototypeOf(obj)](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/getPrototypeOf)
      -
      Возвращает `obj.__proto__` (кроме IE8-)
      -
      Запись: [Object.setPrototypeOf(obj, proto)](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/setPrototypeOf)
      -
      Устанавливает `obj.__proto__ = proto` (кроме IE10-).
      -
      - -Кроме того, есть ещё один вспомогательный метод: -
      Создание объекта с прототипом: [Object.create(proto, descriptors)](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/create)
      -
      Создаёт пустой объект с `__proto__`, равным первому аргументу (кроме IE8-), второй необязательный аргумент может содержать [дескрипторы свойств](/descriptors-getters-setters).
      -
    - - - -## Итого - - -
      -
    • В JavaScript есть встроенное "наследование" между объектами при помощи специального свойства `__proto__`.
    • -
    • При установке свойства `rabbit.__proto__ = animal` говорят, что объект `animal` будет "прототипом" `rabbit`.
    • -
    • При чтении свойства из объекта, если его в нём нет, оно ищется в `__proto__`. Прототип задействуется только при чтении свойства. Операции присвоения `obj.prop =` или удаления `delete obj.prop` совершаются всегда над самим объектом `obj`.
    • -
    - -Несколько прототипов одному объекту присвоить нельзя, но можно организовать объекты в цепочку, когда один объект ссылается на другой при помощи `__proto__`, тот ссылается на третий, и так далее. - -В современных браузерах есть методы для работы с прототипом: - -
      -
    • [Object.getPrototypeOf(obj)](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/getPrototypeOf) (кроме IE8-)
    • -
    • [Object.setPrototypeOf(obj, proto)](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/setPrototypeOf) (кроме IE10-)
    • -
    • [Object.create(proto, descriptors)](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/create) (кроме IE8-)
    • -
    - -Возможно, вас смущает недостаточная поддержка `__proto__` в старых IE. Но это не страшно. В последующих главах мы рассмотрим дополнительные методы работы с `__proto__`, включая те, которые работают везде. - -Также мы рассмотрим, как свойство `__proto__` используется внутри самого языка JavaScript и как организовать классы с его помощью. - - - -[head] - -[/head] diff --git a/1-js/9-prototypes/1-prototype/proto-animal-rabbit.png b/1-js/9-prototypes/1-prototype/proto-animal-rabbit.png deleted file mode 100644 index c2b6ede2cc8dd0a7c171f02b5a81ac834258c756..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7578 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 N^3p0&RT7_r{|m_EdQ$)Z diff --git a/1-js/9-prototypes/1-prototype/proto-animal-rabbit@2x.png b/1-js/9-prototypes/1-prototype/proto-animal-rabbit@2x.png deleted file mode 100644 index d0e116d8c0cce75c90eef6a1d50fc86dfec5dfff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17501 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 diff --git a/1-js/9-prototypes/2-new-prototype/1-prototype-after-new/solution.md b/1-js/9-prototypes/2-new-prototype/1-prototype-after-new/solution.md deleted file mode 100644 index 9256a9fb..00000000 --- a/1-js/9-prototypes/2-new-prototype/1-prototype-after-new/solution.md +++ /dev/null @@ -1,9 +0,0 @@ -Результат: `true`, из прототипа - -Результат: `true`. Свойство `prototype` всего лишь задаёт `__proto__` у новых объектов. Так что его изменение не повлияет на `rabbit.__proto__`. Свойство `eats` будет получено из прототипа. - -Результат: `false`. Свойство `Rabbit.prototype` и `rabbit.__proto__` указывают на один и тот же объект. В данном случае изменения вносятся в сам объект. - -Результат: `true`, так как `delete rabbit.eats` попытается удалить `eats` из `rabbit`, где его и так нет. А чтение в `alert` произойдёт из прототипа. - -Результат: `undefined`. Удаление осуществляется из самого прототипа, поэтому свойство `rabbit.eats` больше взять неоткуда. \ No newline at end of file diff --git a/1-js/9-prototypes/2-new-prototype/1-prototype-after-new/task.md b/1-js/9-prototypes/2-new-prototype/1-prototype-after-new/task.md deleted file mode 100644 index f8ea33a7..00000000 --- a/1-js/9-prototypes/2-new-prototype/1-prototype-after-new/task.md +++ /dev/null @@ -1,89 +0,0 @@ -# Прототип после создания - -[importance 5] - -В примерах ниже создаётся объект `new Rabbit`, а затем проводятся различные действия с `prototype`. - -Каковы будут результаты выполнения? Почему? - -Начнём с этого кода. Что он выведет? - -```js -function Rabbit() {} -Rabbit.prototype = { - eats: true -}; - -var rabbit = new Rabbit(); - -alert( rabbit.eats ); -``` - -Добавили строку (выделена), что будет теперь? - -```js -function Rabbit() {} -Rabbit.prototype = { - eats: true -}; - -var rabbit = new Rabbit(); - -*!* -Rabbit.prototype = {}; -*/!* - -alert( rabbit.eats ); -``` - -А если код будет такой? (заменена одна строка): - -```js -function Rabbit(name) {} -Rabbit.prototype = { - eats: true -}; - -var rabbit = new Rabbit(); - -*!* -Rabbit.prototype.eats = false; -*/!* - -alert( rabbit.eats ); -``` - -А такой? (заменена одна строка) - -```js -function Rabbit(name) {} -Rabbit.prototype = { - eats: true -}; - -var rabbit = new Rabbit(); - -*!* -delete rabbit.eats; // (*) -*/!* - -alert( rabbit.eats ); -``` - -И последний вариант: - -```js -function Rabbit(name) {} -Rabbit.prototype = { - eats: true -}; - -var rabbit = new Rabbit(); - -*!* -delete Rabbit.prototype.eats; // (*) -*/!* - -alert( rabbit.eats ); -``` - diff --git a/1-js/9-prototypes/2-new-prototype/2-default-arguments/solution.md b/1-js/9-prototypes/2-new-prototype/2-default-arguments/solution.md deleted file mode 100644 index 222e9083..00000000 --- a/1-js/9-prototypes/2-new-prototype/2-default-arguments/solution.md +++ /dev/null @@ -1,15 +0,0 @@ -Можно прототипно унаследовать от `options` и добавлять/менять опции в наследнике: - -```js -//+ run -function Menu(options) { - options = Object.create(options); - options.width = options.width || 300; - - alert( options.width ); // возьмёт width из наследника - alert( options.height ); // возьмёт height из исходного объекта - ... -} -``` - -Все изменения будут происходить не в самом `options`, а в его наследнике, при этом исходный объект останется незатронутым. diff --git a/1-js/9-prototypes/2-new-prototype/2-default-arguments/task.md b/1-js/9-prototypes/2-new-prototype/2-default-arguments/task.md deleted file mode 100644 index 1f1c84d5..00000000 --- a/1-js/9-prototypes/2-new-prototype/2-default-arguments/task.md +++ /dev/null @@ -1,27 +0,0 @@ -# Аргументы по умолчанию - -[importance 4] - -Есть функция `Menu`, которая получает аргументы в виде объекта `options`: - -```js -/* options содержит настройки меню: width, height и т.п. */ -function Menu(options) { - ... -} -``` - -Ряд опций должны иметь значение по умолчанию. Мы могли бы проставить их напрямую в объекте `options`: - -```js -function Menu(options) { - options.width = options.width || 300; // по умолчанию ширина 300 - ... -} -``` - -...Но такие изменения могут привести к непредвиденным результатам, т.к. объект `options` может быть повторно использован во внешнем коде. Он передается в `Menu` для того, чтобы параметры из него читали, а не писали. - -Один из способов безопасно назначить значения по умолчанию -- скопировать все свойства `options` в локальные переменные и затем уже менять. Другой способ -- клонировать `options` путём копирования всех свойств из него в новый объект, который уже изменяется. - -При помощи наследования и `Object.create` предложите третий способ, который позволяет избежать копирования объекта и не требует новых переменных. diff --git a/1-js/9-prototypes/2-new-prototype/3-compare-calls/solution.md b/1-js/9-prototypes/2-new-prototype/3-compare-calls/solution.md deleted file mode 100644 index 1b268b84..00000000 --- a/1-js/9-prototypes/2-new-prototype/3-compare-calls/solution.md +++ /dev/null @@ -1,33 +0,0 @@ -# Разница между вызовами - -Первый вызов ставит `this == rabbit`, остальные ставят `this` равным `Rabbit.prototype`, следуя правилу "`this` -- объект перед точкой". - -Так что только первый вызов выведет `Rabbit`, в остальных он будет `undefined`. - -Код для проверки: - -```js -//+ run -function Rabbit(name) { - this.name = name; -} -Rabbit.prototype.sayHi = function() { - alert( this.name ); -} - -var rabbit = new Rabbit("Rabbit"); - -rabbit.sayHi(); -Rabbit.prototype.sayHi(); -Object.getPrototypeOf(rabbit).sayHi(); -rabbit.__proto__.sayHi(); -``` - -# Совместимость - -
      -
    1. Первый вызов работает везде.
    2. -
    3. Второй вызов работает везде.
    4. -
    5. Третий вызов не будет работать в IE8-, там нет метода `getPrototypeOf`
    6. -
    7. Четвёртый вызов -- самый "несовместимый", он не будет работать в IE10-, ввиду отсутствия свойства `__proto__`.
    8. -
    \ No newline at end of file diff --git a/1-js/9-prototypes/2-new-prototype/3-compare-calls/task.md b/1-js/9-prototypes/2-new-prototype/3-compare-calls/task.md deleted file mode 100644 index b3773dfa..00000000 --- a/1-js/9-prototypes/2-new-prototype/3-compare-calls/task.md +++ /dev/null @@ -1,27 +0,0 @@ -# Есть ли разница между вызовами? - -[importance 5] - -Создадим новый объект, вот такой: - -```js -function Rabbit(name) { - this.name = name; -} -Rabbit.prototype.sayHi = function() { - alert( this.name ); -} - -var rabbit = new Rabbit("Rabbit"); -``` - -Одинаково ли сработают эти вызовы? - -```js -rabbit.sayHi(); -Rabbit.prototype.sayHi(); -Object.getPrototypeOf(rabbit).sayHi(); -rabbit.__proto__.sayHi(); -``` - -Все ли они являются кросс-браузерными? Если нет -- в каких браузерах сработает каждый? \ No newline at end of file diff --git a/1-js/9-prototypes/2-new-prototype/4-new-object-same-constructor/solution.md b/1-js/9-prototypes/2-new-prototype/4-new-object-same-constructor/solution.md deleted file mode 100644 index eae8b524..00000000 --- a/1-js/9-prototypes/2-new-prototype/4-new-object-same-constructor/solution.md +++ /dev/null @@ -1,34 +0,0 @@ -Да, можем, но только если уверены, что кто-то позаботился о том, чтобы значение `constructor` было верным. - -В частности, без вмешательства в прототип код точно работает, например: - -```js -//+ run -function User(name) { - this.name = name; -} - -var obj = new User('Вася'); -var obj2 = new obj.constructor('Петя'); - -alert( obj2.name ); // Петя (сработало) -``` - -Сработало, так как `User.prototype.constructor == User`. - -Но если кто-то, к примеру, перезапишет `User.prototype` и забудет указать `constructor`, то такой фокус не пройдёт, например: - -```js -//+ run -function User(name) { - this.name = name; - } -*!* -User.prototype = {}; -*/!* - -var obj = new User('Вася'); -var obj2 = new obj.constructor('Петя'); - -alert( obj2.name ); // undefined -``` \ No newline at end of file diff --git a/1-js/9-prototypes/2-new-prototype/4-new-object-same-constructor/task.md b/1-js/9-prototypes/2-new-prototype/4-new-object-same-constructor/task.md deleted file mode 100644 index 99cb4e90..00000000 --- a/1-js/9-prototypes/2-new-prototype/4-new-object-same-constructor/task.md +++ /dev/null @@ -1,13 +0,0 @@ -# Создать объект тем же конструктором - -[importance 5] - -Пусть у нас есть произвольный объект `obj`, созданный каким-то конструктором, каким -- мы не знаем, но хотели бы создать новый объект с его помощью. - -Сможем ли мы сделать так? - -```js -var obj2 = new obj.constructor(); -``` - -Приведите пример конструкторов для `obj`, при которых такой код будет работать верно -- и неверно. diff --git a/1-js/9-prototypes/2-new-prototype/article.md b/1-js/9-prototypes/2-new-prototype/article.md deleted file mode 100644 index 70120f02..00000000 --- a/1-js/9-prototypes/2-new-prototype/article.md +++ /dev/null @@ -1,229 +0,0 @@ -# Свойство F.prototype и создание объектов через new - -До этого момента мы говорили о наследовании объектов, объявленных через `{...}`. - -Но в реальных проектах объекты обычно создаются функцией-конструктором через `new`. Посмотрим, как указать прототип в этом случае. -[cut] - -## Свойство F.prototype - -Самым очевидным решением является назначение `__proto__` в конструкторе. - -Например, если я хочу, чтобы у всех объектов, которые создаются `new Rabbit`, был прототип `animal`, я могу сделать так: - -```js -//+ run -var animal = { - eats: true -}; - -function Rabbit(name) { - this.name = name; -*!* - this.__proto__ = animal; -*/!* -} - -var rabbit = new Rabbit("Кроль"); - -alert( rabbit.eats ); // true, из прототипа -``` - -Недостаток этого подхода -- он не работает в IE10-. - -К счастью, в JavaScript с древнейших времён существует альтернативный, встроенный в язык и полностью кросс-браузерный способ. - -**Чтобы новым объектам автоматически ставить прототип, конструктору ставится свойство `prototype`.** - -**При создании объекта через `new`, в его прототип `__proto__` записывается ссылка из `prototype` функции-конструктора.** - -Например, код ниже полностью аналогичен предыдущему, но работает всегда и везде: - -```js -//+ run -var animal = { - eats: true -}; - -function Rabbit(name) { - this.name = name; -} - -*!* -Rabbit.prototype = animal; -*/!* - -var rabbit = new Rabbit("Кроль"); // rabbit.__proto__ == animal - -alert( rabbit.eats ); // true -``` - -Установка `Rabbit.prototype = animal` буквально говорит интерпретатору следующее: *"При создании объекта через `new Rabbit` запиши ему `__proto__ = animal`".* - -[smart header="Свойство `prototype` имеет смысл только у конструктора"] -Свойство с именем `prototype` можно указать на любом объекте, но особый смысл оно имеет, лишь если назначено функции-конструктору. - -Само по себе, без вызова оператора `new`, оно вообще ничего не делает, его единственное назначение -- указывать `__proto__` для новых объектов. -[/smart] - - - -[warn header="Значением `prototype` может быть только объект"] -Технически, в это свойство можно записать что угодно. - -Однако, при работе `new`, свойство `prototype` будет использовано лишь в том случае, если это объект. Примитивное значение, такое как число или строка, будет проигнорировано. -[/warn] - -## Свойство constructor - -У каждой функции по умолчанию уже есть свойство `prototype`. - -Оно содержит объект такого вида: - -```js -function Rabbit() {} - -Rabbit.prototype = { - constructor: Rabbit -}; -``` - -В коде выше я создал `Rabbit.prototype` вручную, но ровно такой же -- генерируется автоматически. - -Проверим: - -```js -//+ run -function Rabbit() {} - -// в Rabbit.prototype есть одно свойство: constructor -alert( Object.getOwnPropertyNames(Rabbit.prototype) ); // constructor - -// оно равно Rabbit -alert( Rabbit.prototype.constructor == Rabbit ); // true -``` - -Можно его использовать для создания объекта с тем же конструктором, что и данный: - -```js -//+ run -function Rabbit(name) { - this.name = name; - alert( name ); -} - -var rabbit = new Rabbit("Кроль"); - -var rabbit2 = new rabbit.constructor("Крольчиха"); -``` - -Эта возможность бывает полезна, когда, получив объект, мы не знаем в точности, какой у него был конструктор (например, сделан вне нашего кода), а нужно создать такой же. - -[warn header="Свойство `constructor` легко потерять"] -JavaScript никак не использует свойство `constructor`. То есть, оно создаётся автоматически, а что с ним происходит дальше -- это уже наша забота. В стандарте прописано только его создание. - -В частности, при перезаписи `Rabbit.prototype = { jumps: true }` свойства `constructor` больше не будет. - -Сам интерпретатор JavaScript его в служебных целях не требует, поэтому в работе объектов ничего не "сломается". Но если мы хотим, чтобы возможность получить конструктор, всё же, была, то можно при перезаписи гарантировать наличие `constructor` вручную: -```js -Rabbit.prototype = { - jumps: true, -*!* - constructor: Rabbit -*/!* -}; -``` - -Либо можно поступить аккуратно и добавить свойства к встроенному `prototype` без его замены: -```js -// сохранится встроенный constructor -Rabbit.prototype.jumps = true -``` -[/warn] - - -## Эмуляция Object.create для IE8- [#inherit] - -Как мы только что видели, с конструкторами всё просто, назначить прототип можно кросс-браузерно при помощи `F.prototype`. - -Теперь небольшое "лирическое отступление" в область совместимости. - -Прямые методы работы с прототипом осутствуют в старых IE, но один из них -- `Object.create(proto)` можно эмулировать, как раз при помощи `prototype`. И он будет работать везде, даже в самых устаревших браузерах. - -Кросс-браузерный аналог -- назовём его `inherit`, состоит буквально из нескольких строк: - -```js -function inherit(proto) { - function F() {} - F.prototype = proto; - var object = new F; - return object; -} -``` - -Результат вызова `inherit(animal)` идентичен `Object.create(animal)`. Она создаёт новый пустой объект с прототипом `animal`. - -Например: - -```js -//+ run -var animal = { - eats: true -}; - -var rabbit = inherit(animal); - -alert( rabbit.eats ); // true -``` - -Посмотрите внимательно на функцию `inherit` и вы, наверняка, сами поймёте, как она работает... - -Если где-то неясности, то её построчное описание: - -```js -//+ no-beautify -function inherit(proto) { - function F() {} // (1) - F.prototype = proto // (2) - var object = new F; // (3) - return object; // (4) -} -``` - -
      -
    1. Создана новая функция `F`. Она ничего не делает с `this`, так что если вызвать `new F`, то получим пустой объект.
    2. -
    3. Свойство `F.prototype` устанавливается в будущий прототип `proto`
    4. -
    5. Результатом вызова `new F` будет пустой объект с `__proto__` равным значению `F.prototype`.
    6. -
    7. Мы получили пустой объект с заданным прототипом, как и хотели. Возвратим его.
    8. -
    - -Для унификации можно запустить такой код, и метод `Object.create` станет кросс-браузерным: - -```js -if (!Object.create) Object.create = inherit; /* определение inherit - выше */ -``` - -В частности, аналогичным образом работает библиотека [es5-shim](https://github.com/es-shims/es5-shim), при подключении которой `Object.create` станет доступен для всех браузеров. - - -## Итого - -Для произвольной функции -- назовём её `Constructor`, верно следующее: - -
      -
    • Прототип `__proto__` новых объектов, создаваемых через `new Constructor`, можно задавать при помощи свойства `Constructor.prototype`.
    • -
    • Значением `Constructor.prototype` по умолчанию является объект с единственным свойством `constructor`, содержащим ссылку на `Constructor`. Его можно использовать, чтобы из самого объекта получить функцию, которая его создала. Однако, JavaScript никак не поддерживает корректность этого свойства, поэтому программист может его изменить или удалить.
    • -
    • Современный метод `Object.create(proto)` можно эмулировать при помощи `prototype`, если хочется, чтобы он работал в IE8-.
    • -
    - - - -[head] - -[/head] \ No newline at end of file diff --git a/1-js/9-prototypes/3-native-prototypes/1-defer-to-prototype/solution.md b/1-js/9-prototypes/3-native-prototypes/1-defer-to-prototype/solution.md deleted file mode 100644 index 46d09410..00000000 --- a/1-js/9-prototypes/3-native-prototypes/1-defer-to-prototype/solution.md +++ /dev/null @@ -1,15 +0,0 @@ - - -```js -//+ run -Function.prototype.defer = function(ms) { - setTimeout(this, ms); -} - -function f() { - alert( "привет" ); -} - -f.defer(1000); // выведет "привет" через 1 секунду -``` - diff --git a/1-js/9-prototypes/3-native-prototypes/1-defer-to-prototype/task.md b/1-js/9-prototypes/3-native-prototypes/1-defer-to-prototype/task.md deleted file mode 100644 index 000adcc5..00000000 --- a/1-js/9-prototypes/3-native-prototypes/1-defer-to-prototype/task.md +++ /dev/null @@ -1,16 +0,0 @@ -# Добавить функциям defer - -[importance 5] - -Добавьте всем функциям в прототип метод `defer(ms)`, который откладывает вызов функции на `ms` миллисекунд. - -После этого должен работать такой код: - -```js -function f() { - alert( "привет" ); -} - -f.defer(1000); // выведет "привет" через 1 секунду -``` - diff --git a/1-js/9-prototypes/3-native-prototypes/2-defer-to-prototype-extended/solution.md b/1-js/9-prototypes/3-native-prototypes/2-defer-to-prototype-extended/solution.md deleted file mode 100644 index 6c421265..00000000 --- a/1-js/9-prototypes/3-native-prototypes/2-defer-to-prototype-extended/solution.md +++ /dev/null @@ -1,23 +0,0 @@ - - -```js -//+ run -Function.prototype.defer = function(ms) { - var f = this; - return function() { - var args = arguments, - context = this; - setTimeout(function() { - f.apply(context, args); - }, ms); - } -} - -// проверка -function f(a, b) { - alert( a + b ); -} - -f.defer(1000)(1, 2); // выведет 3 через 1 секунду. -``` - diff --git a/1-js/9-prototypes/3-native-prototypes/2-defer-to-prototype-extended/task.md b/1-js/9-prototypes/3-native-prototypes/2-defer-to-prototype-extended/task.md deleted file mode 100644 index ddb3d4ba..00000000 --- a/1-js/9-prototypes/3-native-prototypes/2-defer-to-prototype-extended/task.md +++ /dev/null @@ -1,19 +0,0 @@ -# Добавить функциям defer с аргументами - -[importance 4] - -Добавьте всем функциям в прототип метод defer(ms), который возвращает обёртку, откладывающую вызов функции на ms миллисекунд. - -Например, должно работать так: - -```js -function f(a, b) { - alert( a + b ); -} - -f.defer(1000)(1, 2); // выведет 3 через 1 секунду. -``` - -То есть, должны корректно передаваться аргументы. - - diff --git a/1-js/9-prototypes/3-native-prototypes/article.md b/1-js/9-prototypes/3-native-prototypes/article.md deleted file mode 100644 index 1c8ce795..00000000 --- a/1-js/9-prototypes/3-native-prototypes/article.md +++ /dev/null @@ -1,328 +0,0 @@ -# Встроенные "классы" в JavaScript - -В JavaScript есть встроенные объекты: `Date`, `Array`, `Object` и другие. Они используют прототипы и демонстрируют организацию "псевдоклассов" на JavaScript, которую мы вполне можем применить и для себя. - -[cut] - -## Откуда методы у {} ? - -Начнём мы с того, что создадим пустой объект и выведем его. - -```js -//+ run -var obj = {}; -alert( obj ); // "[object Object]" ? -``` - -Где код, который генерирует строковое представление для `alert(obj)`? Объект-то ведь пустой. - -## Object.prototype - -...Конечно же, это сделал метод `toString`, который находится... Конечно, не в самом объекте (он пуст), а в его прототипе `obj.__proto__`, можно его даже вывести: - -```js -//+ run -alert( {}.__proto__.toString ); // function toString -``` - -Откуда новый объект `obj` получает такой `__proto__`? - -
      -
    1. Запись `obj = {}` является краткой формой `obj = new Object`, где `Object` -- встроенная функция-конструктор для объектов.
    2. -
    3. При выполнении `new Object`, создаваемому объекту ставится `__proto__` по `prototype` конструктора, который в данном случае равен встроенному `Object.prototype`.
    4. -
    5. В дальнейшем при обращении к `obj.toString()` -- функция будет взята из `Object.prototype`.
    6. -
    - - - -Это можно легко проверить: - -```js -//+ run -var obj = {}; - -// метод берётся из прототипа? -alert( obj.toString == Object.prototype.toString ); // true, да - -// проверим, правда ли что __proto__ это Object.prototype? -alert( obj.__proto__ == Object.prototype ); // true - -// А есть ли __proto__ у Object.prototype? -alert( obj.__proto__.__proto__ ); // null, нет -``` - -## Встроенные "классы" в JavaScript - -Точно такой же подход используется в массивах `Array`, функциях `Function` и других объектах. Встроенные методы для них находятся в `Array.prototype`, `Function.prototype` и т.п. - - - -Например, когда мы создаём массив, `[1, 2, 3]`, то это альтернативный вариант синтаксиса `new Array`, так что у массивов есть стандартный прототип `Array.prototype`. - -Но в нём есть методы лишь для массивов, а для общих методов всех объектов есть ссылка `Array.prototype.__proto__`, равная `Object.prototype`. - -Аналогично, для функций. - -Лишь для чисел (как и других примитивов) всё немного иначе, но об этом чуть далее. - -Объект `Object.prototype` -- вершина иерархии, единственный, у которого `__proto__` равно `null`. - -**Поэтому говорят, что "все объекты наследуют от `Object`", а если более точно, то от `Object.prototype`.** - -"Псевдоклассом" или, более коротко, "классом", называют функцию-конструктор вместе с её `prototype`. Такой способ объявления классов называют "прототипным стилем ООП". - -При наследовании часть методов переопределяется, например, у массива `Array` есть свой `toString`, который выводит элементы массива через запятую: - -```js -//+ run -var arr = [1, 2, 3] -alert( arr ); // 1,2,3 <-- результат Array.prototype.toString -``` - -Как мы видели раньше, у `Object.prototype` есть свой `toString`, но так как в `Array.prototype` он ищется первым, то берётся именно вариант для массивов: - - - - -[smart header="Вызов методов через `apply` из прототипа"] - -Ранее мы говорили о применении методов массивов к "псевдомассивам", например, можно использовать `[].join` для `arguments`: - -```js -//+ run -function showList() { -*!* - alert( [].join.call(arguments, " - ") ); -*/!* -} - -showList("Вася", "Паша", "Маша"); // Вася - Паша - Маша -``` - -Так как метод `join` находится в `Array.prototype`, то можно вызвать его оттуда напрямую, вот так: - -```js -//+ run -function showList() { -*!* - alert( Array.prototype.join.call(arguments, " - ") ); -*/!* -} - -showList("Вася", "Паша", "Маша"); // Вася - Паша - Маша -``` - -Это эффективнее, потому что не создаётся лишний объект массива `[]`, хотя, с другой стороны -- больше букв писать. -[/smart] - -## Примитивы - -Примитивы не являются объектами, но методы берут из соответствующих прототипов: `Number.prototype`, `Boolean.prototype`, `String.prototype`. - -По стандарту, если обратиться к свойству числа, строки или логического значения, то будет создан объект соответствующего типа, например `new String` для строки, `new Number` для чисел, `new Boolean` -- для логических выражений. - -Далее будет произведена операция со свойством или вызов метода по обычным правилам, с поиском в прототипе, а затем этот объект будет уничтожен. - -Именно так работает код ниже: - -```js -//+ run -var user = "Вася"; // создали строку (примитив) - -*!* -alert( user.toUpperCase() ); // ВАСЯ -// был создан временный объект new String -// вызван метод -// new String уничтожен, результат возвращён -*/!* -``` - -Можно даже попробовать записать в этот временный объект свойство: - -```js -//+ run -// попытаемся записать свойство в строку: -var user = "Вася"; -user.age = 30; - -*!* -alert( user.age ); // undefined -*/!* -``` - -Свойство `age` было записано во временный объект, который был тут же уничтожен, так что смысла в такой записи немного. - -[warn header="Конструкторы `String/Number/Boolean` -- только для внутреннего использования"] -Технически, можно создавать объекты для примитивов и вручную, например `new Number`. Но в ряде случаев получится откровенно бредовое поведение. Например: - -```js -//+ run -alert( typeof 1 ); // "number" - -alert( typeof new Number(1) ); // "object" ?!? -``` - -Или, ещё страннее: - -```js -//+ run -var zero = new Number(0); - -if (zero) { // объект - true, так что alert выполнится - alert( "число ноль -- true?!?" ); -} -``` - -Поэтому в явном виде `new String`, `new Number` и `new Boolean` никогда не вызываются. -[/warn] - -[warn header="Значения `null` и `undefined` не имеют свойств"] -Значения `null` и `undefined` стоят особняком. Вышесказанное к ним не относится. - -Для них нет соответствующих классов, в них нельзя записать свойство (будет ошибка), в общем, на конкурсе "самое примитивное значение" они точно разделили бы первое место. -[/warn] - - -## Изменение встроенных прототипов [#native-prototype-change] - -Встроенные прототипы можно изменять. В том числе -- добавлять свои методы. - -Мы можем написать метод для многократного повторения строки, и он тут же станет доступным для всех строк: - -```js -//+ run -String.prototype.repeat = function(times) { - return new Array(times + 1).join(this); -}; - -alert( "ля".repeat(3) ); // ляляля -``` - -Аналогично мы могли бы создать метод `Object.prototype.each(func)`, который будет применять `func` к каждому свойству: - -```js -//+ run -Object.prototype.each = function(f) { - for (var prop in this) { - var value = this[prop]; - f.call(value, prop, value); // вызовет f(prop, value), this=value - } -} - -// Попробуем! (внимание, пока что это работает неверно!) -var user = { - name: 'Вася', - age: 25 -}; - -user.each(function(prop, val) { - alert( prop ); // name -> age -> (!) each -}); -``` - -Обратите внимание -- пример выше работает не совсем корректно. Вместе со свойствами объекта `user` он выводит и наше свойство `each`. Технически, это правильно, так как цикл `for..in` перебирает свойства и в прототипе тоже, но не очень удобно. - -Конечно, это легко поправить добавлением проверки `hasOwnProperty`: - -```js -//+ run -Object.prototype.each = function(f) { - - for (var prop in this) { - -*!* - // пропускать свойства из прототипа - if (!this.hasOwnProperty(prop)) continue; -*/!* - - var value = this[prop]; - f.call(value, prop, value); - - } - -}; - -// Теперь все будет в порядке -var obj = { - name: 'Вася', - age: 25 -}; - -obj.each(function(prop, val) { - alert( prop ); // name -> age -}); -``` - -Здесь это сработало, теперь код работает верно. Но мы же не хотим добавлять `hasOwnProperty` в цикл по любому объекту! Поэтому либо не добавляйте свойства в `Object.prototype`, либо можно использовать [дескриптор свойства](/descriptors-getters-setters) и флаг `enumerable`. - -Это, конечно, не будет работать в IE8-: - -```js -//+ run -Object.prototype.each = function(f) { - - for (var prop in this) { - var value = this[prop]; - f.call(value, prop, value); - } - -}; - -*!* -// поправить объявление свойства, установив флаг enumerable: false -Object.defineProperty(Object.prototype, 'each', { - enumerable: false -}); -*/!* - -// Теперь все будет в порядке -var obj = { - name: 'Вася', - age: 25 -}; - -obj.each(function(prop, val) { - alert( prop ); // name -> age -}); -``` - -Есть несколько "за" и "против" модификации встроенных прототипов: - -[compare] -+Методы в прототипе автоматически доступны везде, их вызов прост и красив. --Новые свойства, добавленные в прототип из разных мест, могут конфликтовать между собой. Представьте, что вы подключили две библиотеки, которые добавили одно и то же свойство в прототип, но определили его по-разному. Конфликт неизбежен. --Изменения встроенных прототипов влияют глобально, на все-все скрипты, делать их не очень хорошо с архитектурной точки зрения. -[/compare] - -Как правило, минусы весомее, но есть одно исключение, когда изменения встроенных прототипов не только разрешены, но и приветствуются. - -**Допустимо изменение прототипа встроенных объектов, которое добавляет поддержку метода из современных стандартов в те браузеры, где её пока нет.** - -Например, добавим `Object.create(proto)` в старые браузеры: - -```js -if (!Object.create) { - - Object.create = function(proto) { - function F() {} - F.prototype = proto; - return new F; - }; - -} -``` - -Именно так работает библиотека [es5-shim](https://github.com/kriskowal/es5-shim), которая предоставляет многие функции современного JavaScript для старых браузеров. Они добавляются во встроенные объекты и их прототипы. - -## Итого - -
      -
    • Методы встроенных объектов хранятся в их прототипах.
    • -
    • Встроенные прототипы можно расширить или поменять.
    • -
    • Добавление методов в `Object.prototype`, если оно не сопровождается `Object.defineProperty` с установкой `enumerable` (IE9+), "сломает" циклы `for..in`, поэтому стараются в этот прототип методы не добавлять. - -Другие прототипы изменять менее опасно, но все же не рекомендуется во избежание конфликтов. - -Отдельно стоит изменение с целью добавления современных методов в старые браузеры, таких как Object.create, Object.keys, Function.prototype.bind и т.п. Это допустимо и как раз делается [es5-shim](https://github.com/kriskowal/es5-shim).
    • -
    - diff --git a/1-js/9-prototypes/3-native-prototypes/native-prototype-object.png b/1-js/9-prototypes/3-native-prototypes/native-prototype-object.png deleted file mode 100644 index 1353bd9c..00000000 --- a/1-js/9-prototypes/3-native-prototypes/native-prototype-object.png +++ /dev/null @@ -1 +0,0 @@ -native-prototype-objecttoString: function другие методы объектовObject.prototypeobj__proto____proto__null \ No newline at end of file diff --git a/1-js/9-prototypes/3-native-prototypes/native-prototypes-array-tostring.png b/1-js/9-prototypes/3-native-prototypes/native-prototypes-array-tostring.png deleted file mode 100644 index 4ed5dbd404fe8ed92f6a28a5234b0a6364fd6790..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18613 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 diff --git a/1-js/9-prototypes/3-native-prototypes/native-prototypes-classes.png b/1-js/9-prototypes/3-native-prototypes/native-prototypes-classes.png deleted file mode 100644 index e1135834b76e3a8d5755c3e622cc446e8f0b85b6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44747 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 KOIC=Ry!$^+bT+X7 diff --git a/1-js/9-prototypes/3-native-prototypes/native-prototypes-classes@2x.png b/1-js/9-prototypes/3-native-prototypes/native-prototypes-classes@2x.png deleted file mode 100644 index db1a0b8e27e09123aeca37990cb3b9d8c6d6ef95..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 98810 zcmeFZbySmo_&2Ty7B(UxsR&4kbeAaI-5}i!qXuH3Qqm17-7PWLP)a};-2lTGdTC|`+Z;UD_&Q;uWN5K)Z{Oozjgk^i4zwU6&`7wI6=mK z;>0QXv!{tyZY7CI5&xX@(vp98qO6a0?ZgS`6N-;ybo@?kz|I8e=uYl!uh_DrTpv7l zMN~mw`l_akhBYOS(%om142CH$E3rIwq;AQaI7xa%n)oqU*&+cj6Beqi zLf;MVF|xO)b#)7iE zey#Cyp(|&(EG{0sWS%ugC3Ak|ca^@q70B(x&u#Wu$8zfSYT5$sIew zZj7b#{4W#7QF`|>01#8*3D|@`j9|Xpo2vwpuo&TG> zemtpbiX_g|tK1E;d8o`sm(bdaeV74VD@rJ~tD}ZO&1*MC7R*9|$~}6o{$|zBZQim%}t%-i@$BPG5ZP=E0Aw7;!z@{2jVkgt2ZqB@U#_y=O^kAvWkQI7;e}21# z--PLxIDZLcio601+U$IK8!DPc_lbMmuk0iV5di%6xy5~aPw{PT`f;KkxbdF~B7Ko;RQ)HuD!3u56RAjdqV1jUi#6;54x~sXYa( zt?)s!XV~48ERU%FJb9b=q-aNs+3zPQNqoaNRs&fAE6CM!BDgdDVb6O>q5)vmwl4gu zeSgJ&DV#`s>lYQ~V}+h15p+_~tPs7VlTfv<_TVPsH&cJS{)#P;Pp!_<_LqJ$fd3(* zJpV#;ibhX|*nRxi<;Z(6IsY=YUyh_>cGpEmV&u-T_y{exe1TwuANL5Ciis0_e zh4~DL7;BpdIN$>#MZDf5G6_U>Rq{xT*hk$p$}QpXR}BBVcj-W?icf$O2hqPT#c;lF z=ysvvRQ{wNLGdO=gc~4L{~fc?5p15E3KjsM=13ikS*-FOK#7& z0i6=)3BIxA1d$?&B2$4kcJ!vZit{fBQx1Jlk$+WUkL;|@0hjP^+z9=2r9a7yO0app zN;_Cg_eOK=i1ssGNt0T)hOd%5&*Bf_ziKEe6bTVH#JG_y9Ltj~dEr@DU5UJ;rG4S{ z1SWzYwCZp_pUcg3d#mp&3@ zJ#c64U}?Y_V2%I`kSpG*Zu3$*M z6+|4|&U^mbNG;A9aE|g>mfT=6aF|~H4>&zxBtp!E)1fTCiIRqsAM*NJRI!v%Seft| zNx2=}Dm?iwrraW;Srv~_&f{N_4Sh|i03Tk^sWh;}Fkt=Lc3-^u#|2!;ARO7Wz7x=5XXMX@P>4m!Aj)_r}bVfpJ{vjp@Z1(}>&hRgvjO3q6 z+raC!*nf-g#haFK9*T|^j!Ho2!=>+%|4Ozdiipmm9=STd-+GqfWO)11)TUU4B1VE- zrAOdDH<$gm8I$Y%`(}Hqli>yr&#=S&M>~4+0{$U8uWpGah%Y0LcEa}66)_A0W2Hy!>9R`4GZmM~V5`>i>jDEr%Pc^%wNn^U9+ z7+tze&Uo@a`+PwpCQ&2j!ZB0CLQVCvB=5-8l*kIGsAuO(=!jE-N(*EkgCGK>DFPeQg)?km(}9Ze~h-5 zib#8qtkQ4A41GXRVSh11Dt7>#x5$I?{Lem@e=H2X&3tU%H_t5|eQyiCX0}C; z;5^iwsy}BURLS8D?-$sc-G3;#^6E!CgRX6Cyi`8yZ0a8_`l<71!YCOWh!K2Y6_Id z$>IFj{^mc%@r1?VV)br6?Xj^F#ZZ>&QkI%5@|o9(XHwuZ0_12SGZbEIYhHn#cJdE3 zoo!A|Zbsz~^r5(@N5z&QQz!wAJAYP`&N<5;;;)l~j`#homC_(eVPTh#90n_Vw%qe> zA1oe(!OfyLY{$TS>DxtM;nI?d)>*wAhO(lBH@~+ zJxf)I_aVw$N%s>LJ)n)V#cTd63uD4N1 z)n(}ePHuRsJC_t84oZikRFVXMkxlzVsLEQGu2+qGq6v-PY}PFEnqfFsf?-{BnE`eI z)#ANYxjTYF4_XZ~MET5M4E+fSV@b%aEV|@QFHxqK1=)5XO~v8s=ePqu%bLXu(;bzM+K-Hz)O=fH(hUw2X&jL;>Ti9+4lX zW}$N=skz^FTG+|dLrkbS6$+)e@4W$a?6)LS`<&li8q2YmePma`m@5`i>ry|>gLv6; z2zQfkb6sW3%@mdE278qiW&*nvL;cgdnx7zcV4QAJ8no;Rg-NCw4h{8a^@WFhZO&>( zi@(DHq6XO05%H;XL8-%SH)uN3fU~tbC)AS3dClt$fAUk;>-Quj!uI5gMI7(CMAD z`!rx5snO?Yh+WB@mpG##ehI|>GlVSXamL8-^^Lsfc!x=Z%J5K z#~(nwNTHx!mToohJpLqu-I$~hO`YW>BX$11Q_%ta>VeDQ;81Ljc9j_)q8-t#L4$qm zoQyN7qn}~4N!Qb~zod1`VPsJ?=>n}!s>fzGVA?kQj96oO*{}un6jG!PzelxTHmyks zMnwi5c=Xd%&%!nXGxAiG5-~lzQY*B_2qMiWPINA>R_goNkLB@RlZ4W$2yr>_w#WFJ zEK(4IAC&hqy?1r`NxO9HqX48@oOVEtnO{Ygm%Ih|MPFaoDJ1on>?_HNn!)-4Uktxm znpep#86({_5H3ykLwA*(Z>o)WHT`O)b-LGI*KpSSq|=^YWa1xgoaNV%_8K2PSeFel zDXZ#dn}06ZE$X23Cg8!?p$6_d$E-@nO;B<5zG3Ok_IyeDa;zV4*QR9Gsnkxj(cQs8 zmm)0Ctk&VG$i&f1j}a&o7mgtyx9=A>Pljai9dGSKs5|8rfsCq*E64QMYEF=--Y{_K zD|F!Et*%gMKO3nYsXAqqJ_Z?i`I!a4x($oE$75`s*D>GRhO3*cl$p>g_6n@hJ?BuzRFkIKMqsNZ%|sW zJgU@(Ms&ZQuzY(Sdg0({+Fzoca1bMG=df3={xGPQY8-^; zIv;LdyPVGNlkczZGA5A?6!V}lL`nI90p+IxgJizNYQH5s5#OQns!7#CK7OL=iR=zh zy*U?nW4>*0#eNp?z1@Esxna!nK;*$1lpzzBvfa_kZ@e$gm7mExADYteJ23u%aeOBi zLfTxbPiye}^_Dwi^HOWIU$*--t7+w}%e*HVb#?EX_1oW6+^dL&JBR^>>_5 z@mHp-#;v=IaWTQV8t;ON;d$C2+7bm*BYl0a-Oi(m&F+utgavY~yw0TN(nwR|D^f#BN)D(oO%c>AkspcwWYR(`i1A zQcHi3e&r6HDPQ;ECjV?BM;;D;(Rj8(Hwh~^$RLcJV@Bn8{1bFBrvEUyoz;H9W6gXY zO7gNVd8Vp(gA$YNIc&C;KH1<&1gf{{@Eap&DKgybc2Wb4Z93Lh&ws5wpn+_pvejmD z#%&~8Cz)L-y0&~Y)8IQfe=2>0Ism`>LHPhI(L7#nt~1xDp6IqqCW4^@n~Hd*`0H6m zlb0iOw)>O=B}&I~?A0fnC#pwGU-aHnpo^0e4VzG#e2+Bh`zMqk`4P&TeEx{ykEhEc zx*2P;jhAd0oCI9E*Jl)K+r%yn)>JPrBX^;rTB9>G8Uj!}XgQg$>s0ooh2JAJ`$2Bl z(!X0- ze-9_j{)pJ(_Kc>D@)Roq}93jXdynaz>@^R(}T+?Q0wNo~@ z1}{`3{*mzaeBsJ#i<61L@>_EQ$LXzf3%A9F*CwQu`i~`?Ac?u#649-2i)-@jZ`^sp zQ~}&ap7p9BgU_SF zRA}#pf=hA>{cG9f-2gH7?P4`+Y`LTP`b0)4@0Hz?;8WgYG+P)#VE zHVU!oaa}`~sqVOB1!0!@*Mab8QTQm<++_`wUD@=B->IiD+k83PgOQuOgCOEId>Z!MFV>ICcp92NE@ft+Q2?M{?jRNma%_^G+A?EMlK!y z^G*B)b2F^2jl8$rdVq4T`nIF|^-WTMZvYc1Y^xqNx(_nGM-i=snoSJ$)Wd0+-3q5`A5KpD=i6W0P=eZW$U6kqH z4I^jBI(WSjmFIAvg;2Jg=3n~8iS^vLX^1V4uO4XzV6Gd<;JXeq31}L~g4I#I_2;ZW z1_OwLPLU{bK-2S#={5>*aC9JrK14`QNS%3o=md0Zlw9)WOZ!$O-{JhroJE|S!wLY53IqYZpEo3UZxf{Lb72bPV zU>#r-PA4~uwm>x{xru$&)hXFvw?1U6RDRg3?u{sGc$2?jmbO^4TzCi#boMmi$wKdp zC+LZZUV@gHc`Z`9m2Y8h?@dH!NsPNpLH(I5X-Cc}j;6kS0<#jb&cIleos^s&Jk;lC^3cH*)-xua6kL<7aYRQQK#M_|tz8c38-{Pb zYicrpLt0#GJ{Ld=7i{9Q8IsCVl3WSMk5)a(J-m<7J*`=%4!~(Ehb2o2ks@>}f7SOp zcT3sqcPY7=D?f@3?=O5yz29(e*}L}9IgZ-M&D;P;d+F#^ zp0^F&uE!tlra>oC*F1M`RQC8YMTsG@ibsReEc#X@%M+=G1UsFMgm5Inh$&^0QC2BP z(5LL2)l^Z#CLvea722C2h(poO++GLywx%iCrtWi+I}!`iEF)8{>7V>HG8!XE*Z02h z38}Mp!45SGY>6h6_YvhpfX4OONw&cNLoSYYvqV4rndhYyhK>^_1Ilem8 zw>_{eO^Zf@(weQjVdj+2&n%z?;!Eu6TiEsCujrVvC!czj%LTff*{W#-8=N!n9^Wm~ zusFwfH(E?ei#CJdgRc6~=-yHsVlB?3a0YUxd>^PPH(3!4Cj}$@ybmzc`wi8YgQ#B4 zG=c9kP%pIC(a`kvV2@w$=bdIOm)V|d6USC_>4A2Pc7Tq#!20OR@<#5xfAYLL#I_PH zx~r=BF~3At6ZKRwZSbtt+theW*jl^Yt0G0X*SGFQC_2(Rz1gZZ`Qg>HCMte~!j-oP zN%#RP4+}h;oiNf2CKfdDBMFp}%+t~|RsrgA0%%89e)q%RFd&^z> zv_dDl1D?ePfWPJ3oJBkouwlL(`E2Za{9bty{??)45ORH4y-ygRODvk2tsgwAH|Cg? za*(#Tn9BS~0g_}nq9-K!Q=SYAJ5NT)<`E&_`k!r@2fbVYHgy-}$0JuKA#{!N=)b7Z@AGf;aGa(cnDm zZ}XUSp-DN`DZ|56QqZS~K4^JYkvV+XP2dchm4NCIcwb6+$I`seZ!IG35OCc2K-BNE z0Akt}hC4eT`4hET@AqSxrA+N~QlD^`+cp6P>+K}-?zZWslw-WG9e2y&GF(s z6YUeYc=}3xIzUfgxdawf!eiqEF)z!Pu#aX~(c)+yS>*RAI8uxrTUHfiUnuKK0;8&p z9L;v>uqzktnF|7*XLcjpb4S%SA&tdb>8IFcV4tl70>6(WU8a2}K5vNSg;NpszxF>v zf=w3o&Dkk(EkCn0pRyBJua=?Mplpu37OgOrnY=Z1`*QB3Bd-|eV8LBTT2B?kr1IeV z_mo@$&)}iWNaxu5phi#s zQgq}SHcsEK?risT`1mle$<3Ez88evV7kuWh-PP=nMzfw-L?+$dP-tr5x<^!|9AVlA zIZQ>Ne5tW#v|Qe{Q;kN-ah%pAC~D!90369mslg|xcYsY>YMkf_Xk1P;t?o%EkP!4Q zHcP};z5z}V(uS9E+Rl|Dhm%aDdx7#o}5NION0Wdg$Ah(Ua}oI(SuVG3Twv8LB)a18|Q1$KDBm*Rk}+0k(>8sPQ+&7 zU-EI!EKhnrH@b!|u~Xc$DPON!QeQEv_83)-%RyZ8#9Cpc4o*vV`5QNdHln_yWgT!H zE$1J`36?i+MAh;knyk(AUb4PhfUb#vu;q2;@0xr}-4?)ZZ}x!!CSQ-9sWq!k4MUli zF+)ZK8VnAxTO_UZsYikL z*^WlxA8otLcvoL`wI7UxDv2mb9Z22hQcK$)=Y(VVoD&=y2&}AusN&r2Iw{=YDIwL& z(lfL!qc^b|$`UXi@)<eGb2J}QaLfXa)exFv*Hdqet z3$QVMyGZL3y8wQG*X$Y4wpB-LHh7bM%XI1UYv6YoS#*nZ%)3-5T)HFRB_&XXc?#a} zG~FAwitC98{O2V2j(p1=PSDdxMfq2`%wF{*Cip8Ur2$&!`@8zyEWC-E&&xAF<;-Y! z?3~$oml*|lXkhE>*vioA8%~y1I}x7EC+{u{0?}k_ssLg<$JujMi)Et5Ts8VIe+Fx_ zp7wUyd(#g5J~?Kt7HS4hv^}pi31Z%V=IW@GZwqTg&@pWe-)7FITbD?dGuj!b^vMp) z%LsN`ec%G#H!Mzfi>;pw>DPHppTj?f@dQt*cH(%>+`<@-ZN!pVb!4+DHmu4hxp`tg zODK;9W`9}Run|`#Y#b48u2@xt=aWTM<2Nt^D@ady_mKwE`9P58u;|uPb*o@L=c8!8eGBJt1E5jexHac5H(0j4 zv~#V@pz%w+V3dczCG4e%0O2%cO?X|e|>P?^Meij{%F9DL}?@}eH?HxqOsYRqDIY^h}@4+ZF$<$|AmCifMNi}0@0J15#xQRxHfp(z(( zcg@tg2@h@#9VFPOoS{bBywObJz~+xd?r=nvG-4bV9@3@pnF%zoze5}WiwmNVjf=T! zth(_Dc~pABfg9Xq;)PWu8zUu0ERkUh1T~uzAuS5#G(z;WqWHFb|fbq;-%2>e-ZA$cz&|u2+)K|bRb71*aNwOfqFY10^ z0^n2jTkhU{$;CXuWs}4s5bMpc=dXr21^Obht8?7nd6Y4%luqT(P^_7)!ND%UiaB5k zG-Y&<)MbEwv4OOIQW6fQ2!lt8twVjAx_FH>v%T9HUj+=() zjIYmo9h(9-nw--BVkzJ?9whY|#wvm>H>Tol-E4dhvzf7nP^=V+10x+-H=CkS@U z7MBkiJnsSRi;P)!yLP4shrsI0;0Kvlb4!nSd*jMX=F9e~MsXZz;%1I<1$z$(Z3Cu` zaqmr?ynxk!NMHXb0ndro$)bEIPWj*ebO1;*PLoDJ%3DiKYktLYp@LMav~HL_?h7;V zXv!UW!ORQFfHj&LKf%H68T2;;6L?yseGcW(5fHqz#IBJ-VJVo-{T!QH@2mhh?JQ5G84T9iv$J1Isy&`HyA9%@wj3V7Oa zeIvz{KYy1u1PYTIbGe=uRY@ndPXeB~=rgTe>I61%y$gC`zhSU2EldpAra#+eUn#u0 zgPmgUb2%sIVpyj#Rl*@>dns)n-Dxz&v0S#ryz-C2-XSKx)K^;{G5rMY$%pT!pJ2Jt zE|w6mki*#YgD(-`kvP^vLHz9o^}84lG>irt1x;)r`-+gq_Cc)PZbPp7s#ZbhZa&~g zjfob`={)@YPvUO`9eEjoNSAdD2#}e5w={DtdB}@y0gb#{raO|XuYCr3Ww8tcK{7Z^ zOY-(Cky}$^jh5`s&voqXEp}S?*n@_nU^8+CL-AAThxdXraoV0Esw=}jDpA34KFtYSgZ1g5U zoxfGDk<(?oGm}vRUv78P{}~r_H0f2iLu;y+`iSk#HMp3W#{t2HrW#e{%;WQ1ioJS( z9t&nsZfhC@fj>T%9Ac;SkYS*m&ntd!@ifMIZs22LrVxH-wM3bK`a-wT3*6mRG_Mb) zjx%vP7jR-sOiV!M1U6Gd1fqx~rUL*s7PY;g{BjlSvZ4UO!mQvBT!Tq}fojBNK`#lo z1yB&eUYei2F+^M4f^|vl=`%q0U0XP)p)V_r@Y<;q@ktXJE_7EakJa6&j@|LHqgf*0 z&v)Kimka)30>#@mWzhZ?h(>h92+0W|L!Mil-A9%x^$C|;zzo|ZYH{r zGnv~^gL8$O`yAo9rt0qx3;kN$RJhKoa#`Lo)^PfwfJpL=6Y(`9CwvQ_3Wlbk*DeXIB3(RVR; ze8=L*(9Dlmx%Sz-aX3eDUs**@eW&?r?y~X-8WwISKS{lWm_ml2)FFQMbWRCwhU!6v zZv=+l%O5cI4eq=MRf;EDwhI#n)CU29J~k#9jaer9Ms+#J8#ExAE<=e;sv^HaBe*$k z$es`AMelaicdZ|UI*JSW{3LrZ5CKMW5dg#YJEsr!i#zysDhGVh_=+$3bl=U>faDU& z#0dvGfswu$?{s5vo^0~ll@AHL-|d+>qA_I%d`WKPMYE!c6HA2IwTL%&1@-%!=oh+5B;Ed7-w6q zg!|CqEvBsz5wkSF;=8D5TU*R@r8f+r?Yp!Y)GlPIT{@k~<02CzE0i{H%Flt>@f0Pd z;fbYUmIV!XH7(hiXsQekV9O@H``bXgxeqdw%xTPJQ_Bpo+QbZ*%lY`MS=&y$xxR1E z9k^>w?61w6nYovb-V_#TAQq8mc9V9eGwYCtZ)2;R)Ozn8tO%lG0ZxNR}=H2+Jyu4L%piSDF(sW^?Pid(Mfod z*_@Sic`2z01t&?tcFrv^QE@Tf$<-mXeMkd`U`B;Myu7><1X$P|M&&Eoz+}nV(zNOt zHUZQAUDFq^uSD^ngOZW7ETdQiWI@Ua;Rh1|#`YxB6+<@W>gl`mBWa~J7U%+tVttVu z>wXp?k7r8*ch$tQy*_Vzh`gyBLN4;RLC9YDM>lh!I_xLpJYjne2|>N4vb~Ob{`Pa4 z2+;fR!4w&xZqzTJy}JPx6#(eFv>=MEG_w6Ros{EqB)Q0PFVr8|xRzd;N$shY!ebNc zTmjHo_jiTtrhoovZr#u(n$CvP9a&-_RxrC6G1Y=8 zlSGkzc!N0;U)fap$BUC!&>0yQiAA1s0%ktX*Oo{3pz2@QGer;xZhGwO_rD`BjMqrl z2{^%P0n#+T(~>8lNoOvyHw1ReS4Qo%F@p5Q6w19f-%x8SS@sgEBj?JaGi$1e5eU$^ zOVP_D)lRXb!9mc&nFhv(_>!W|J$#EIXBco!9d%zoYB=yZ18`jmXc_1YDw;I$Xz_oW z>cDo}_g2W(2O;h?-udx`bjyhw?^I1k6&h2SMQy#8XW^1NGhG9YDBGE&#hP|5@n?tY-Au%EsJ+Xcr1EIu0D#-{7j~pa%4vTsVu)T%r4$RD*$UDqa^XTHoGy6)u#3? zCqaDHYi28iA$YFVY3S7jDXwI|nPMjlhG`*egeGUW*zs8ko(?9mnZ2hmJAhBAthUVo zIu{BlOtdxjiW+5E>7|y3NVNqU6%dP7Wep3M78{|G&0U-m-$Nh-Ey`b-SD~-Barr=m z;W(~65&HGoSrOUWRgE%EzgbCll2{H;xERg+wIzkJYF{pVlwcSr>!jt6AxOb-gxb`% z@A>)5MPM$(WTH?TaSMxDHdC~5GvDi9NlMNN69sGr@Myjz=ZcM8j^A)XV{sz7H0w=F zJl4U@$Rg+3+yw|Agw^~uPk z4%Omv{3t)Va0;}+T1)8{5)&+>BjnRWGj%3GQVu8|mx`jhxM7^Vu7|H4-k2bDyKOoG z*r_7cZMnqFz`<~g@wK8`$D|y`1>f_!Yk3s&A??O-|Yv!Ncv_d_tGf@HEYL{!;J(++lTSaz;py-#EiNa`U-T z`I(k9G~LCLrtdzW8qj&Dhy^K|i`J*o8OGeAg51uYS+{H|RUsjzxxfA4{hvrUk6evI z9Dg04eoev(etfB;1{y7_QyMY$;f3Gdf=)|>68O~b z`e~(f*R+uDD&NqCC0t@pF?E*J`diQ>ARCrdzq=_s zCB4dLf*TZG8Ap)-#6^z|A`Yh~qG!b?OzU~#vEeDZ zNKAy~rd|*J)YH({6suTV3iVQ6FQCYj$6@4Br+bKek?uP!-oaNulQ~GIp^xHsGI}z* zIKeM66<0|v$!l4xmnrtuVdy4gH>DYpGq=xQ|9eHcE!U4{dVVS2A2x*%zxKCh()x4ZKi^ApkQ*2`1ik%bA&ei%L>U17kLt2I zexAbCM73nP&Dv)?W25{AL@RUQG@zElZ@DZC_KK^zVpX< z-uB#(&mSy3{_01`;LBs;Xi0qp>E_=dqksN;PxoV>q4T-=*e}ri=c^wSoTVbh0^fPB z)tvfw$zw7?eL0B(4s@3#P5(Ca{IdX~$&Y#99)o0`uX=8ZQl^aMzn?XVa@Rcyv_opXtLZEI;b-){OS2f2VJ>M(^!mCi^Q+ z33$Lc<}b(T22Cf+yv>qi5mxk9J+u|0w2bl$TxymKm)1uBJ@Cf)l=f?b{5Qe1Ff z-C^UycZKRbhO*D<@>M4{ol5Cdi;p~n*Jp||o)y;;GB+=31#oKN)Z@R)Ry}5aYfZ>B znW*G5yq3Mj{RM?VO)f-(>|k$QK1OJUc3+A-xHWvFwk_dwo$<}Fafh;yKN`x)Rh468 z`X!Js;}%O*ZQTHpgwfV*LZt52a>5ygq@&)A)hBL%(%rnTEgr2lBb~((fVj>ck5kXi z=s4LpL8)}%OT{CZ$dtYZi(llIO0F6XaD5EULW_JlfSP;s3M@Nj$ z(nb;Z9m9h)S%1Cx375qij1Y8kJw_@2a4)1FXk7PI(l~XzSB4qG&r_UlefM-AC{vq^(ramK+B~=Zqfu@|LJnGOuoQYVHi3Qv z7SNx*mJQ0fabPB`#^CcqV61lS|R?$hv>)^Wg29)dMGdO4z?9xfly|fk}XwnW(;Xb~?V1 zXO=t3hGN50nS&WlHamUSMkc(eg)O(9Opq2>cCxUcc9}lem7gAV5bV*hm9Z^J1yh91 zYT9*4c1al&Io2rImeV5+lmKqAr3j>B!vQ{DDVixd5p4P_9`2IAuaTRSR404>ymH$I zk^{wU$CLnDs6%L6W{Xn7A~VZ37_COo$dqy& zpTY52)r9Pqz28dzHvGQkCpw)NLCYGdALh<@hm8Fb*E=CIqw6)B{^41%`cz}U>tdd- zroHiVMwg3xLpYFx1(7cD@rDV7_;Es==V#rxyBv&Lqqnum*3ba$#zrMyUzo-F7^$uC zJDX*b_uQlw{Ov3@w$hgJ$cGjeAQDk^IGy@own;#r#|JEu zZGt^~CYj6W(^#LAMSV{BAp#uORvoR?5JZgcAD9V5-L56xQqA%k=MYSx4H2 zr;MyKQ2jAY>+@}oY^xo9rzQj3S7<66YwrL)9AXMrh{ydtF(_4ruf^47i9ogLXxa0C zhS~9a7F|RvnHzW9LER9~ip!zD1qgF3f;geQp1-&aLKM^Fp!KQ|&0&k3N42*Y8c&vy z3b>VLMhDmr8-ou${Mi)VX+cXB%Q%D9RgpBZy-O2I@D`B-1I zN2T-jCB@A%y`UoYt|Ypty2cRS;*=Ltf-48-Iiq4y9KG(#?sCo zMd=Z!hPDK%0%x8Sl?`JzTICUC6gm8Zn}l_L!wPo4D}xPzx!;1fLf;Xy@e93_4`c`L z)eA(09b^`Yrr|+sgV$_J2VA=U%+nC-)iV&})JK`&H$R(?rTNd_rR7m9Yw}MAIXULm zE(W9DaT>0?(ZL8iy-F9kt6FqeoCaH)=M~*&OZP{84@VX_A-{cD)b#9FTIp&*P|tJD za?pVN^d$`u86vjkw;4EvHOoY%lGjERqgJ!-Hl>63PR0@w;=EdGXK47n4t7pjA%3 zpd*O_uThW1T+d}{Rwc)Y)BeapySuZnI?w&@I1`Zo%MiDNN7R5FE6;QxUx&*0?!gIc zPsbHLCAiKtKiOV14REQJ*V2MjWa|io+6`20V$=INIUT-e4ZSXbZGJl)Z8PDU{qzwv z4@NTOL0k1z)q#$esJCoe6WeHNPke#d;Oz&VE4{Ag_QHE|a|PMv9BNpGJv!~w_k80n zt7tbPRQ;_?=S*wg0drE90`UEfmsPfV8ZXlXv-<3j@$P@~h`k-S7#AYW2yYS-buq!` z>O>@8ub`DM$L|c!j>rk)scTND5waubc{D@|^jUN$kul~%!Aw1pFs}7M+yI2>a?e>n z;7Bh@0JR+M7GT>qDc9vMl*!t)%zO}VzgV?d@AKDkhBTtL8%5?dT*U8mr0nl_9FJa~ zebo3Asotc3JiGZjA}=B1d=op;&OptkiJZ{>t^|myZp3QQwC-h*!8^g_vq|Die%a5s zlV<%hym=ANlx%XK*#qGAs! zF$qr~DR)@YALwW;JR6?==6i;10O<78XkMb-U_K)#BApMTp7;_j&WB?^Mbf?x*V`{r zknl+5Rw$fRp>uy_;yrrWzZG=Kzt&MbY_Z>J9KNWW+llH7!po~PC^XV6tQ0dJs8y+F z+)h&ECs_tAmJ}22rP2G(P(0#1XYzu(%4!0%Uiam!R$k8@4MSoK>`>c);u@}i`Cz@1 zVh0<_oMVTBFzHH+q&;Y__Sf-b?Lye&@q1OnA`a`=5`RdVPwMSRfnsBl-`N(it?(;x zuz|Y4O1|f3=<)GU%T?j2Vl_y&O>Yt&yKzx?g(T$NVEiZC3$NVHd4}fC6(dzo!b}@) zrY*N&V#4WzRltWU<~F(e!0=rY!<}vIb@|N#iCxG2EIxT<$5W^5!(8hMJ@SU=?RrsX z*qX6oXi1}92jh>ngN4x0JB3i{+Y7t~@- zcBrV;-qoLvw2qyqu0~D^cdh0k#TOZ<7J~b&P!i>Up=O6gIy6KL~xD7)M4tlgT0fd1Zim4i_@cJ}2m>QP84wnVP4ncoCR{JY84=*Stk= z=C8EwN-n(I?LlU|G^H*Tn=rfo{9(W=x*o!9?xLl72&hvE-fya*jE@u7%!`0)*0r@U zE!MClDTUHoy+uw`5pnTT$wIEVJd^lJIapSH2z4NOazV-bi)F2HeL;KAGBk<-ylXm| zL9-fYEn2Bqlu9?5%Ajod$~uL`*LQWMSKrjx_LFsu=MlJjxa(>sy#pAXnXlA&9iyjF zdkE?aWGVJl3Vx%UtIfwgf(;se1AMl48Dh+Z0&p^d`rq+T0%y41 z(i_%hZQt?$`DXG#2*uv}+s#1^t!r%#GYd^>jGugrC*M)m)q+110l@%mM;LSabt^Ym zqF^@q1|H^IW5}1PrgxkGFw&Aa9szGgUCcTD!Hf5T;#aNm3{wr()h?i~PFx!tZrJX7 zJao;#{QS@x=Enz7qWWdjKCeoSpm9}O9LP%p%sY$lX+G;`4p!9KWy=`{3kAI#D-RZ< z-~vjgzlv22;QHDGkkhPAGm1J^ny!}!Z_tf89hV-cT8Uq93GZefHqXT$wQYL7c5@rQ zQqzsJ9Y;sK`ctzA(oeL!S%XLB!dIT6+zx~g=RX;uHM;zqAWb4_%pOc@Vudlnm zB^-raG(@bWndWWAA|YLIpDCU-t!TQapj)ty`(oc4&z*#29;a$TWY5dX26M&FiB;bU02JK z(u$^LX3`O=UaD6*Jxg%TNPug?z8j~G!2YQfF3nQV1xhr$@Yxa$Hv5@mAK6{X>t{(Z zqwQZHS!3{Af~*#gv?Uixp8t~^Ke%BbXLIxNCDoq?DzD8#+pZJx*x{0Roww_ojvp`3 z@J%P(2^k1SEg)L1XjKMnqpCAat1PbvN#W9-*Sl%hGz4JP(XGT8F&fY|R)){lS zZFXh6-Z#z3zR-(sT_ov7xtlXAfWd9zAdkD<(bqibWarm`Y&lTK>C0=g1&lV25hnil zl+L9%EdDn6>|wPycCx!srezea*s83D6j1es*h<^58Qzyd@&lcUP>Tyvv&flB(04LH z7Mr(dk;Y=~Ry;K89dvXNSJum#>xlK%?)eryjMt>Q+ddZd7_}q{ExzK&Dmt7%2-hWG zOBx_)VUA~@e{#%SW@0sKS6~Kx<7fP?LRxj2mKjwE7~4GBvF>|rY>i%n#FY4jT}MuF zi3uIv*=99ip^&!*8K?UkHViJbGBB%Wb>-RW2BU_(CwO=3c)g|7W4>^qdglSdQC)aL z*99mYQ%5l;hbMu_%giK)M0hP0*cKBD%Pr1f$$zceOjc2H*BljWc;6qS0(Ta}>qTwM zUmi~Gx;5qMHItVvMlRSD0@;7uw(cMJLHDJlkl(2yN2L9}BjVvisqJ@>VR7j&>+XU4 zh(w+21=Yg-_)e^REXr(m-lggrj&n5cPK(F(I`HjwZ1R9<0KHEMt=AWi*sFHkwC<^p z4v1_$zTjYGzbZGV<^`;nYau|1P?ov~!k%MKvI%KcXAc2nTI;yR+c0pW+UmE?%rdOXw@cA;{!OPs;{oj6S7?H&Q=&3HI8CJi`DQLSv23tBiN$|P zqSR<-(xu96k<4==2G*u&#CQf!8rO7`VLh+AqLhdQ4W=Uvy@G{|yCXgSD5w3^t)q+d zTy!59ez}%M&z|P?DDr{{XR55@grp6s%=Ex@V7(!V>RlX3g5}z6?J|gpSr9@MIXLav zWs1)`;Hlbs9^ZN&s3Ygg^B5jcTewToWnTC2h}d)Rzu0@LusE8oT^I-uB)A191lQnh z!2$$#2$JCLg9Q%|+#$FR?(PuWgS!Nm!JR?&5P9C`+u#45?}PuW=bGy3s#Qzwx>xmT zBCG5TU$dAT(MZYL5{WwPQA6F}B0a7()dC}m-f8B-;v1~lmYZV9IW&ex{?myvzhe&2&ZyZ z9%*l4VpPTKJS}^Z{DSYyQu8vpZiVh0c-Vb3$!%@!xTlW4c{(OQ=cS&cK+Vl!Dqm^a z2gm!k(;kPiTVs6nBdu41%i0(UF2}-+)KTK$JXg}1r<0Is8aFE~^k=PSI)yQgwB<#@ zxeyT+{}SP_Y~l7I$WXA18ad)0QGUhN-*py4B@FxZPW9K%(8;0Aw}?DP#X->oS!{{; zHJ$#5EmVCd&Wp62x8Q`{q$=Pg0kg98L-Ko~Ej_hTp}L%N)#MYyZvYj}?bDQA01?A$ z;83K{l2__ED~yLzOaWh*O`XQnkf;G|>2O<_!;iIRHd^~u?@K0`a6T*1C)|^sv2JZ> zth`Y6g1H}BN$c8hnRwlFSMHd*%d2x6PQ?5yAR@X|R6;63*N<|Hh+Y}G#lLJQfle9q z%&ZI%PrCMF1__bf^ihtx0Na~kNOcVBF%vI0p$cQdb>m2b@7@lZXbBH$VVdo|)9MoP z_aTet$1USy;QZRe+fvGF#Wf3*fHsDrx|K}d8pM{KehxH#y1X!ABLZSC&#R%;pLtS} zUaG*rG-a6tJ64aL7x>fk*GIv#Zo$K#v6Q34!pefSWH$@QI};NY5C6QNO0L%~bWeT? ze*32glxc1IA&z|GkiVngq5YW=eJWpWb;i4tT9+F4YC*jLDmywPTyEqtwN1H;<^Hu# z1(keVS%40ycm0uH;9*+}3kPxwiT0!A!OTfNti86%1&ihd z)gNvbpQmvah6Rn(pNZfn>DKi(wYiEeyVwL>b=Wps|J)rHpvWbty5I8%3QCg^|)SPOP*OyoFoyzA@5aCQpV)JtD!`sJ9tZSsr746h3Y9G-K~U+y6L zK@R1>>fB!1kKQ^k``1#2lq_Fo6I6w#IfvgOq3vTO8#>? z64aJlGDk7+Pl*6>aqrxfC|0FvtUshHYO*)wGU-^MR*S;)AycWcbN9o==}-DHmlga% z5^59w4?TL+Y+Qd0bKnM&GrCgDMdfipvSDUPk>S;l z5^`oyj>{E*mTrveEvuRv)xhTQzpB|lD%mMRYM9Qc@cgaeBs__v!5bb!4}`a* zF<7CzNmi3t23|lCmv!LU4*U6wh=SDV{kbJd^W2?(mo{RghJ>g1svL?xDD5k`Pw1-{ z!}(4u!`}FGBk=Txxwa-@y22@IhCQt0Z?DW!-KEk!{c_dIiaBQuse&_hk^Yj2knEW* zgsb|D^LN%h3NZ0vyMn9SSMvE3i~r7w_{3vC9L6BG(!X#13-BS#0=p=L(q=pE`}@B6 zzy5lHYm84t@r;OQ;r=Yf-v|ErnFJ{tSBdXp_>U$1kN+XhhUBtX!(;yzuZ0|t?}kxT z-BhafN{{8uu8(m<`P(m~*c;&9dL26BKXu+9)xT`x2g6Z>21bQSqjdPVil8<{3NATW zPP*_}4^lclPU|QAtZv01DUy*#m9$gg#@94NPn1iBcD?$tbdo=w8sW}Vf*3hH>s)J=p3lTpf zr4-M9#Dzg`YdbYq;~QHbIuft!$)@J!JQ!X7^#BLup9hf3KxAzghF9_*ahclreAYZ2 zu~#kJVruBsyc!UPoKSON#Qsm#TcHgyv0D$9-wPy6kHDR4x?QHEbX0V>Mp@-vOQ8|E zmuj!DNvrN!ER~uo(<_EyQZavQ;0GEKB8#KbRB~h9^_tX|LizTfS|KEl8tY0YGqgvG zAJqCb?0bu36KJ7T26P)&J|CN`_m5ByL+{7WGtS|WR5I+F!t1jH`)sISE`hk$fe`&iAf|@%8q$S3x)RN&CSj zYrOR+7cDi;Zsou+d=f(1Z@4AU#x_hLznsW5UGctFTXV@D;KZl0cb+SeAV$nvZB-u@ z=X5u#Skxx55Rb|0oL%h*u;h4eRo8QGP+gi8ITBANnYCVFpwo;+njCXS80{>%0mx;qpr8?ippEVWi?&h&OW)>42w(v#$_`!<>fOux74S-LM|T?1U(;R z@~~3+V&$?;RwVrzxe+HdWo&ISw>I2v+sBQSM>d4U7hPla;KVFYJtXKs8UdZtqnvRQD~U2$Lmr;6pR$ONoT-rt{4?thAfG0g2?` zX^`Bd|57a#t^i-p!NO`+}@6!P$sLdmlG_i`T-ZYk)g6*|_qUTJ`qlj(H zYShcxEX%JD+gPRn8KXC&>%|S}&$V#5AJ9dF& zxs7*;a>SwE*gMHO8p(URj7MB`B}b4px!u{zUfMm zkC#U@Q}FAF&H2mypl+<#!6qH|o!!7I-7=xV0Xs*nIn>+hn3Cx=rNGfFLMmMeD~;k@ z;5Au^`?ff*ily~gtx?hLCr*MGj=}vv#@K9lp&~Qzw5Vf0N_ysZxB@iUW=H}B@F{z2cC+PX#iI|VI^L7`@f#<}%OQ!vL}t80{s+az z2GS-Kbt_opJ(b7PS01e+{Cg@3>&)ldL3k{mH*cLcJJOsEO0rqyZ9GG2HRpkrvV;O5 zJ!l7#c4MGR=w7cZ6#C^Xtat$Ny&?Xl9)J4yey_YHp@&l_9pmw6=b5L)P=^xbYB6*6 z-7}+Ucu6Oa=!s(h67rB&3=wh8sNU^Y<8R?rrUZi9aC^Phfn=t1W-{@o&!G8mr`9{P zq}h-e?Lz5A229e7g`~eda()eaPjs~!<0$o9MnxctddY1iMr8z*c;Ta(oNEZ4wuGKU z)m3ib`y-h>MXJiSgX@m?#wK5 z^M2?Rm+sr&dO?Q%3Ff6D{wF@{B_D{_h4LXo|B;{^L?HZ?`29UwV+FXP;*rlOTaMT= zdprq*h|K>%;7HGL_-iXR9-%BPzWPLoa)4%4%0jEZ<Jq7NA)G!(eH=T&+R zAYOS0tIMTlcinNTQ>AM`N-1B|BFbdmP8uafcW8 zCrOSL(taE?Hah-rzrrcR=HIG7Fc$h!#SZQ-w*Xt|%_|X96XhXQhqfPd@qCkG91(!H zy+~bPQ|Td>RUZZi--X|TsdiS=N z#sfh4^IlV{5?3Lb?BlzW;tulN=RYFPk{wroq@uP0$ zWzj=bN!0LtnER$qo6=?BgL{T68==$ZooWuF?eoiNBZenX^9#w$!+1V4@Kv*n@%>&I zZ+aMxJTz@TjnW*ONGex~i+w{p9Azvq$E@>kF;J}=3Mt~f={vm2Q2k<{&Lf|g-{j!8 zebkAxXQ~VltVwi9@Gm&^SeMJuS4w!Qc^B-1%s6NhW+bqQEKQY$CDOE>y#qxrrY08* zoWvlzdu-*GbmpCoqF+?O#qwKKWCT?kPANtdNsJc=$jCw}R$ovPj00y0UVvE4xw~!V zr2{q08?K>n)E@gC@twpwq%5YU;GXZ~9T?Tp*Gw^TNEUm<)1xXQA~W>PeKIhoi%4IG zN3DQ+ODrw5%jcUVv|>Plqh&XO?O4^elvUTelX*o7Ojxc{DU`{mZdD(Pte8Pqj&=E~m3HHMRnJ(zn!^7G2~vqR$v% zqqN?dH&QHFe|kwuvOZw6ODgmTTO>z}lPDKMazl7wcP%1n6;YP9bO|V~-+6xPsZB)d z+(rh}cDm%=Jeq&oy=Q1p(YbTFy!NzyhJbrUB3YhRz4aHKLhp zH1P&)o+i93D^QHbmKJUf`wCbIUnjT7IeunL{5AEDE$22Cqc=J|`~_&V&q_w_PlY%o ze%Q~M_gc_)_U{ORwVJimV7!eMcFvB5JH$7a!(y!4d}{fVH1 zo=;kZ@mpk1LK(b9{Gd}JQ966k-iZ3lj12kInsbM$@VBwx6+rG*{ZY2urdMnSt=EsrLG+%og6a;`jD_n#L%@p zJ-0zMSC7znuBfG}ldh4`*~fj;9Z(d%2UpARMz#g#^U9r588&P5jnqpK5|&Gd->IITwPKCfBY0t0aFhuFuD{ zH95#O%^{8D3-r@X=hKZ-A761sWhLLH!`)U3BKicW0M@Dt>?yBlf?+NQ-AhCbW_NmD ztxMq(nvlj8;}O8I(EiERX;IlzZzcOU4X7m}#=- zUhJ5nG^Q#t6tRh7`W)c5h@Bu4*z2G-sVdSb^wy znB-*=b2U;uxVxE^COyFLs-V`RfS7O?XUu{7VzQ)m2^<0E50AD#XDUEGC&30>srR-f zvUF~+$!=&~`BB>IFGe_Av3q;PtZuHErA$AqnRCPy8s->RGO@O=ofN zV=wlQ93ms&U}R=d2tDqhC!0Kb6$}}`$%>x>Kk%rkSDg%u$@R#nsn6yU5Kj$7cL9~# zJUy(SA48$pO^3MWkIMqh5?skx;?!y5SV*7z1}t}{wO6EE+2=2u#GIsU?sJsaQC7X?2B&Ff5}MBd`P7$M11XPrZm$RT>5$Bh=8dX@hA&I_PlX17cOs)oyb@}>t3N4! zdknI3*f&|M=a;l@u)j94&H5C=%C8_PerEwJVa>9$j=|qxDI7qKTcqM<~L4lcjETgxPGuALMHOZ9zV9>@8 zTgxwWxvU(1ycnxL=f|eH(JYc0Qpk#82+p?lQi-cF^jt8M?moXw4##l zZLgB7(9zA3*?nNGrxCGYfvij(r<`&{oSfgcph=cxDflNT?yT?{u%jfkdb56-ikc8x zs7lXC&9ee`O3^RsZl*eS?tuoCYbClWNmZ#UIvuzE5F-D zh+0&pbp zY{qHUH2=9~N2d*LkKDm0PLd=^o{B|eTPSDC=?h|pDw_!B!DUyz$>C;#=5$)ALisUGr?4Q2!WYkFMh|$%HV!FKXwF$?)A0)il#3IT^FMsmyjJ+4Q;0&Qu(Ex2= z-tLe%-h*5(qUo5$vJY5o_IqYM*~wogO_RKdDCe&@g? z%Y~DqdEEXy@a>X9=g^YM*}{j3sl0ur&w_QQg=1^5t!U12vn=H{YRa9`$^TK81@xYo#0z{1pK?xF7T&3f zQ|}}ksVjfU2q|*vi_ZE`%)^n#Ta9A1N9kYKW0;rPWHolggjj`1-YVWs2hctxuc{yOi1NJO; zcv8G#?m^3b(yF~%*L{>so&C|LrNv?y*s^DQ!2`gS9VS|5e`$RX_&{a_?qYgrIbZ?S z-gjN^oaE}TcFaiVt*_Bli@0Z{)RS;FP6KjP3e{Avl6lxK9{5RdzEKVuDBzCXccLFf*Zh*GgAfTg2;<`iS3b7x`IvljBeCC z9W*l+pH0hS0HgERPUv{Qs*G|;Z(zz{w44y9{C+i zZMyTb0##Gw->xwu4pz>_qZ^ZjjVt5csO~0%a_am*=IRH)C~0#Rk=^1UwugGHd@}xV z?la^FXl}3XS1u;QswH#OaX$H0!?c3LIF@xAFCc;kPLO4NI@t~lU1QKY4L=g>u_P1H zitzJ^%eI8WHX~s_73hYylggVnXDZoT(e30G7!3I@I}SJTJD8|Z&n0y(Tnmeh!J+YLaVoOn(ArRAZHLbw`;LO)h%66o`=FxjtX7zEll10_VvwC-uCi>!n(d!tVC% zV_fPDxc?Z_-!y4s!lTKxH!{(1W~oPO-1ySGvy=~D##JFV!}2T&MG`yCYgSYr%uV+_ ztZkG`phw`;SeIj$`|_m&#rRUCnWgSGIqL71jPU1W$# zbg3UjLOBs>hvD5)FPds*#LMsFc76(;0S_=Lf?{9pOCT;2WlKl)YZ6U{?Rmsa9(XRO zGKiIX#DO|i@W4%>3KDHv5~1@rySJYrN!CeRlb3s8HoWaT&|dukUXU~%4J7k~yq0D9 zXJ1XHpq=?*($LR}?#0DXM?RIU3vSrv7RLwKd+-QPj>9e`VQ$U~Ypjc0P^~hfZ@FZ5e%9lbbt<((XbFwR z%!$9w0m2WoVhd-CCnV7z|7HqSRfIE`o=Ga;lbJ?<2wDz4*to_*eXIkuZfo# z`QmqHKN?|z*mve>N!UdsJ<3{QZrviWH2=c7C(7e#_o3{4Wnz^7XJ&u;`Saf|X2hEf z0{>DA^of6)v5c_A*F=+c?6w zKP347{XZ1U2rPQOBhc6BUxND|m)?4C==taLTy%c_QHp<00tz+-q9VKR;r9P`-+wx4 zLxMC=w^o7w6RiJNN8DJDl}bdK{;z}d#DO#@Tg?9>{eOw*&!sJuw{R{SPVs*owlGXA{0#Ah)Ox?Zx#99gFG&RH1OP% zF!~lXH!Fiv1ZPDtO6J_&>{hV8?Gz#%WAX_$4lmkrxq<3m^o-7ZMl?DcZ*)`KTF6^9F>vI}#|TIN zhtBiFZqJqX?2=G@8rgS6eb%Vs0UgmsaS1VFTg;ijuWi2UcX7=$lrd!No+Qy-Gi(W4 zg5|;QUPyACHyFW68;66{whVb(%?|tG3!rnKf(`;VbgAR?w>GS@8|`dHEOAZD>rWz> zTr>T5R|J~#dfFzlE4!(~)C9wRD8CiP2N&J+4*3(ZN&xwtKeM2BHQxU<(On*|V0NXO=wAj?r) zJgm(i;Z?pugajs^NOW%Zt64q{7^4bO#F|pTJM3hP<*c=Bk9 zv~3DkX{F16nv4MNGB`PTQg@Fpa@X%^>*Sc1fBZaH9QDw7KJet*(feS!CnQ3*vdIM% zZ7SC6v?)(g#E6jfD_3)Aj<^WU!534fKFET1rS0piQ5e51t{pO#u8+Unu^e3Nn28;2 z>TP*Z71)-akXXtdz6ri5qTOLhLpa(wsXrvHl0l7tE>x7aIpL}bubYe>mH>w)iRV_9 zGtx9ZS{NHeM!Ax6#G0Lj^T`z;DEj#BzP=SRb>eeLi#Tz@Gm@fhnY0khW_qZ8jszK>cP~tLVrMUUnS0>2KYIkS9anZ&=~evZ zU2O5<;i0j(8$vyu0uQ;-p+L5v+Ha(+kE;2v`oeEBg@ z6RJujvAx&y&0WcTrR>U0xhXc>FMsrkYV{0*<<*wo;jcmS`FOOYU59%lem&Oi72kb{ z-)(`ObDr#?q2{<&`f8~}L|WV%jzM<+yVA4N0Ek-akiD|-kZ+J{Op0|VCnW*B4HXMd zxQ)lb0bPhX{qcOh8W1-}w(M%k`=m7S=r7}(i{mNG>||mOG^nV9%czV?CDRFgwUP^%u0Jw72O&Q0h*V8T&)ifcB8A# z{)jC&z>Fd&0Ep>UB}-8NY|fu%7V>qQklXNo@~1x2c#s2Q7gx|)PdY-j3VVBRqK8jy z&%-$OMiDy%#jW$(1_* zaKc@%5{?lE^_#l^7In^eV1ZTGW{2Ca{%InUsy-@P)z~2rY9<~{JXFZAk0huygCuP(mrr*&h;!#G=5OYp?c-t5sRHWnhtxvh%`b@_ z{epSzIzAI@66aH=jk!eqqEhIe?b9MDdA2Wd_qP}*SQ{5eass{UU?{744vg7Gbk~ZB zG^0JGwHiIWtE_$@EV2)9oReqhu77I*gn1o==*^|Rh@8$K+%-&7Rb$_l!uE<*GiM=aES4?1)#Jhs+;gQPG5&fF8T5}GIMD*O(iub+o-JJ}faYD%EU zRZjn?f2OBKmS2-(I2m8U{)PZ^ekJNh(%@3O*)7|jEw zM59d6G-s+Sa{}eABCBPgQ@fr_scZn7v8C+NQ`I?|-x1qa8!Ex``PGBy{*(8vr!2R! z-_F;SYSA^iN=cF?%5$Kv3JIc=dZ?((GQ?!swa0kTuchQopT_p^qA68GS~>0=1s)}{ z=1f{{RI+rS)vp0)X6%fJw9t@yhLIuQ-7fkp1^9jCD^1vmnoPMU`m8I6^oz&!$-sbE zxhVjL0O?824n78Tx=Hg?R6k|YwyC4+=i-XcaGf>`dFf@=$fNK`^s`Cb*yG}sqE6d- zKp(s&FL`i}6r$!nAH|mC2Wi%;Q6NoN^iThd z+y*a+$VysD%dYiPxwYZ(A^j;WW2iWv5?e!Z_09nf+3d;u%U3_zZO!J* zMP!^2v&4c`yebVm+_oYN%U9Hrc%~jlrh{x2$8%*J72F#%SqTrCcypnl`LYDG1 zd;=1bY@*mP6yWow3Qx0|4qJoy1y|R2RTp1j;s3xFjSSs=B|nY!d&`cXoMpW`t)EJ6 z6u*;!ynF^j!~{O0AJcirRZtbNN#FMmc&K_DTz_yJ&EJPrbctKSsZZt;0#IO zUQ3CETc?LDxi)WmuP@uG7CzKsi0_uSHg3(2(ASZeGm+Mcwy(hC3ImtFjrzWOI*FlSfg6Qc8pK47$JC03K6h4gg6kjE6b9Hh*tyQoAI&Sh)dY|4yv=s zalBZCuTIj1aZ?@VL)ga#jtRT5p^CC{-sfqwOm`FFMVAQyaGbpOjxgeEl5PF)$|Lr9 zKP?qD$774bs+Riws(*Pz;hYf!xs*H4fpHY%MHU{r{q{q}iXfXaBCZsT>WR(ff%|G6 zYnw1dp{5D#kSqg2CcM~L^6Pn015=ueq17c$Dwbr~(6i?W)V+$qAJ@?+ zjNok&-RUUZb>upub+oIzPQ``^KO)4A5V*&Ny^(V+;{1b%v|S^A z2mSXj1EH%D*=ncfl0%&_O?ea)fZ?BThg!Jhll4R9NE+id@QR-K9wYE|65~xDo@4%^ zdAwI35b>OlgYHRHR#UxM{p#Xp7&qUM>`hZD4Lo;A;~OwuY8Ik2nIJgQ@>xVj`0Rt_ zjIv9DHFsG~%~(<>u=3h!?n;usKZO66bXHru?YrNl0|f8}E4Mi7N?%sokqr(8_y^6o zYA)BoQa*t&Z($3FI?WO6ki zzS9P$5JKlY5v?a+fPUNp!3nKg;z3WN{7kOkc%|y>;0u6mGEwf0|JJcU9VYe)9YNS< ze8^5OG9Z0JaUyhluM2cB;~I;X_$%&1kk>4l!c|m!`Y2ZVnjBmu&2%OAW|PncNjf<2 zwdDEXhWPJCLB4ql`JQ+$am|x}P2ack`*HOO2&bU0Xpo!i$Kf}NOFbN`JS_8+4y_&( zzbN(-E=M-hlb$DJCe6>bkSjX4+@2zw|R>6BY>=flpGf9v}G*uL-|ARxIc=r}4CDfq5lr z#hy{D|M&V9c<)ygxN1E+{l!=bXTt#To3pVh->sIN7{c3Z2AuTQe}vT4m__%5VIdfX zwQ;wieLcEh9|zG(itkUvcvGzV#9d?W(z=YwFuZ2TY zyiG>WBqg=ca{Y3v@+04`XZ zNrpzBKo6~2ZFa%H7Q^IL^&FDxzSP(G+3!nnDEA?W??+5=-!q6lsBDcB{wv+bEP{>{hvv}4b*wR*hYKKHb-C0hDU zMILI~5EtD=g}5y@nB^%lpuN(%X)j3eJC~b|3}Fi$l&}#XW6a2eGCsC8_2oc6u4zw9 z%(j_8nvZLxnIR*vwn?u!5zveEXZ@v@?QJkIL0^i8SVp7Thu0QUKgi+^if7+ROOFJY z+%1?-{-z!wuUf=$qdwhGodTuK>HtzElD{&5KZ+NX=toz83ufzmNS;CPQq^-mW5Dme zim7t2xd6V{_`6G>86Y|%W44W`@-~X*D~Wnn_>=PHKy|@^bl@)P#Xp*V`~f1e(St}V z7;8jq&``MC(&d>##jR=9Rz;a0fSwKWc^t&SI7h@TKVp7uOXZf^mRlEBEJo+P3G2!w zOw+$HbUr0#glxJpTzYm)ctm2>hJ4l=@JFVrEbi@7O7X(PpAaP9LV!~%PW#PRT^bDv z47x3og5%7$WEaLO7%)uA)->Z=iZQaYMe4X-xzWQ)W4*+)@d{kXg16sHJZ|NW2|cmG zz4$d>n%dtcGSf6_g&Lw_d{A{w=BlOo!Y4&@xq`>$Lj4K;NP(aIM;;V9O)6W5*{YCT zKi4(GWD@xKcJK70K0o+Q#=Y`0Ql6=NG*{oRRa zl(S%nomM)qpGG$(rKa_nZ*0eB?2H45r<8=@7INzfcn`VUhM^s7TZ(OF=gO8V+-DA2 zd;ID_;!waIZi4plv!UZg#hRu;ZF-|eA5_BWD-2kzw@}-o@e1OJ(Bv72k$?<*bOb_Z zxz!PWSrgIb?12}{jbHoJxi|4#)0{n2aKXY1v}`Ww5cNP868j+l@gpeEDWps7Ze^jUx=76QXFFu!W|~^>eJ6}ZCkG_v1qYI zNAmU#gyHsbLkP5lreD3q+xI?zA;3k2sbsLAtK%PGN+`{l#VEt0_268ISr5$oB<^JL z%9ozU8Lp1Q^V%zAnJZv(ThkNp%u3r602V4`+FzErIj!3D%_thno4O}(osbMnIyV#r zS-1;L>NtQlD5ZHt&@If}dO^Wy)u*urtyv|^T@uopQRLKwPTdFVboMh3#t%lq@^`Z8 z6iBSjjW2UjNSXEH3n-}b^^LH^kpZ<>E34W zHYI>p%nk+Ca5R*f6q>r~s`i(M)vE3UL~IZH(B{6v*N9*Ca#y&8*6v<Xfn z0)31@40EetLAyhYQCfs;1McQ?(>1v$%g^LI?i11pXRkgMA+6p8otYGoc;`1uL4ru~ zMn{h@#%zn}UNe&kvK|Gi()arr$%puwlgBj+i&7^`y|ED<*~Vk~~u_l^^-N}h=v0)R!f zOwilJwW*n5A(>*UeK_k^QkP~Swbo%JH`hn*3tyGg!54e>Z*#7puj~&Q_bmA9zIpeu zxm2y@q%BSEbSmGtZ=dTq0}H#gzWTm`@{xdh%b{S#*Y@*nr~b^&(-HfLD`>~@>9=Hf zJ2F(kj2|?J4J$Yw$8S!+DWYA#fUoy{Wck{+5p~pu*87aQRS$kEDoBkMre2aV+;0_q z6;{SpQq-udq`(O`M}=2O4TDAW^VWbX3a`=dsG{Z=?3gB``pHVhzI;SjpZyS|pf901 z7fFta(wRz)@}h+XtNk|vT^rrUMmIC+pMEAIT##M{n2K<$OPfu^vR|{b6p*?GU546_ zDzm#=%I$(qI8w+MDCBH;u8W6OWus3Ty0~VKp`ULZZBu`Wbm@ zI-KnTX#N}bNP1YmeoNaE083!sJ82MZ9w|?3qorl}8CEmjSbt4auF11-58_4p13UiOZ~ zuFcEK7aj!TnMauAIa=mT7M=5ydh8K7X{Qq5FbjH2Szd6YwcsfjA2SUTU5U^8-;W}u z*m5=5M2+Ms#odq@om88~vME>EFHkWp9di%P=zl4dF@ks?Na#U>we{?}8T0Fef65n9 z!wmHG<>c;1=kRtOMAM`?I;|0>g>}Wk{q*Ti2rHo*Ap+ZMR@zf{8>o6C{;~^i;^>bH zM0mbDA1(aCpGUSI<{c$1Z4UKQn#ZhRo`-xfIm0b1i`#B-po(>(I?J7|z~Ahwaqyfi zw00gUgT24*UI8fA(T_GAC0}df4Q@`&(@HLMhjV{w#M?^aS>I%rffz!9Cy}$BZmEah zrf$OXt@n|<`DTsNy1l~?WMGi=Ii4ylSL%n_;ZI%gh-1Xyt=V21Z@J6EENa`KMp?0{ zZ?e_$b^KCx)x&zi_V!)wQqXJC#F;%>J1LR};67Hvy>w!Sc6NwcOw8sh5LHg8dnFhv zsEZgw%+7jEo3IVg^vUoEBdL%XGT-;yU~Ko|-VciWgn0WF;r`U@UKxy}ZWt+nrP~zK z26_VCWTQ?QIvak_)&uS(UBNb>V!3-&$IQ8$>FZ z)y`HdJTpJLQ5r^fnmf@%ytNBylXd=}x5T-r4D~Wy?D6NnQFwL1{>ReUDaaqnzvE{cLoEy!P|`-TY4u zSJ>bK4S)`0kJw~5J^O6_Yu^&lD4NqvXP*5tr~dkEVB?+=AV@(TmR5&LQX1kJ>L5{V zp5M;1T2mhp0@PE5$4|rdl`5w%)C8|+(;q(&e>6*y{jf?c(cMeToW^qrexlzlbcz(B zA$NMs!`eMS?ku=~n31J``y?n+csR~Uo^Oy~$>yusd1jT><^C5Ix4f9m^XA*01gyr| zrcx`d#n|z~tcz$14jUEs6VkoPbq9$RlT-7lIQSbFr?F%cKMp7}ii6#QCIWhy^hxWe zMp@-?9toYEDhn7$u*n5i#$4>z z*<8lg-e(3L>M5lA?yEQu-@ymH>5zVUQ&!tpOW(9R>h?)UyGez&Nh=WV3qASuSAlM} zUJ!E{q+XxQO=P|}#7`8DhMbvrpf#VidG|c3W=SBpP`Bed4X?y%#WThnaTn2#&q+(; z13cgs6po^;tgo)7qe7c?t&iBVEA6p^Y8(uMRhS;9?c2DLMmAAc@$|Sd+iuj7Va8N} zU|r5r=)OyLzv3~%52fVISoY$H2DnK4TnR26{NJahLYn7ZEQ5f1q$xuy?r2oKh(~@1 zErG%r5L?`-m$d!s*Xv-2)vZ+puOftaZ^rAd0YRE66f2O5kDQM>;)oiUMv>uzjEOv# zUqmn;r(c;&czs^rjom7Q8c7dV;`ZVVUaj$ZO0t)6nOlhX2o!@V%x{RcW1{?386>`0 z(khSJnM|%FyKPa}?~We=2NY@xVvfo~=7U;uC46HUG9}#A7zcA>ij%lsq(gRAe1Icx zq43=SlYF>=os#kK7RBMkM#{z69NqhHtbks$#uq;N5a1Yf5857xNa<+w8?%N0?I}2> z4;Sk^(_fS0G+U|BNWhhS4ij_R!}-R9Juva0x>ICw*q`^&a|U=aS$7e!Ae1upWHiJ( za!9NiN%!RWp&<1PT06hFgR1!HjMoRdJ+ZJp}L4%s&!NfZlO3$KRK>C-iA;B?v1xmg;#sP%?chkaw^%fDmfSdxW8@}k0I z$g6iR``n*fL6SgkrO3`CSt*!?TbPadZ%xPaKL;CDEKWVxr9@JgvNJ=_xwzEUH#};r zidR@J)j)`pO9~2TSFE*){Nj925_>o9V?ybIg{}9JDoYGfC?BwD$7LN0-T+ z9-4_A$vSdXj8wFnux8g%K*Gc(->jik#^3n$+}PS&`m&Koz48?bBn0>fW4Ax~HDP|H zF)D;Fjlxfx6wH+&**AL^6LatS-$qj;c!G?f2RTzD*qGg?>-VA)*OwJb5s;jUgbzqZ z(z(6h_bTxB4&G+4PF~p}T*^;lv)7{;+?+W)L^Db23@=S7cU2DyfwT5osFv&oJk_jR z9~AcAFPh)@r!yVQ=Wc{@eAQ$*y<6Dhgv?Q{u)3Kh;ZxJJCpR$9N&7YO+d7%zs=#z1 zj2p$VY2Au&sVlFCJd{0Ru63s=J$vNjda*?o2ZS~?Nc0;a^7_H;O>x6 zJSwXgr_??3I*_{#uU!{wVI)mvf*ny4!a@xi6w_ph?7lN`>g<(&bagSq<*OUW$1hP@ z_+;@Goaw@6JuLSc7DtOk2EOzaqSgNd52WB|6XSy^H6?`9Y{u^BM%vt>ey$-uzK(r4 zf0DZ$aJ)(RtUkfPM)Aye@yhbhhiARO&&)74;0sz~3SN4vshrLVK+g>6dZfGU;WBMR zVM$e1?=){*n`Y?9G#jGOW;MvJi84mn)N>zK*KpV%9<;JKe0bHvdA?8}PeqykiDN{d zf^0GDJYN9Uajg7>>k)G{EVVjsn}Itc^v~_0qUM^rP;7U59n%a*P5mv_=c&>dQaP-( z#jUK26P#;_5V+dnLCjD3QM+;CU%7;5djNDhOb8)DKQ8zWP8h}^m}v!sA5YfV@B$a^ z9jOMrhGK=xi(9oPNzcN0fM$CaWoOoR^3qP5!?KV-zjtL@wy86&ku+NOfXR2~*RV~v zAZPi;@a=$Gho_2R_f~|mxu6!Hwm}d36MPT^P}^T|=mOr^m~s2n6)knYST2=*MGWh! zo8dSDn~oM6#=m@|ZoEd-;N%I1VEb z=Ke!b!nWgQ_s)2=12J^<@H3MMKD6yo$Z?7qBe)MrAqCUE7p8>5Zsc0pvax&hDC6}}p}X*KbMRu+yn&c2Lvx+x1V zFTmmyg`vk=MD1HdpXYxe>Dv>2Eu%O)m4V9DiH4oOb#>bQL@s|v0%ayXv_J%(k3SWTL{EYKK%aoceE-taNsmcU&3F!f zp)D~}iwLCtfE@z)Jrg5a$BkBmz1I5hQ(Q!Ld!IhLl!-CH%i(x5=4qVtf}l5I(_ahx zaHq?KR*lbQ{||d_8C6HqZH)%E;0Y2uxCe)z3GVI|0&F0-Zd?Kh8eD=q1ec9FNpN>} zw~e!LZu30n-0|HpzW4n8#=ZAX288bF)vH#msx{}V>K*KF<^aF(^RJuyT>g@ugNGAo z{>CBl_Tep*i{=#Loq!SpDcUXq;vzn3Fm3|B=y%x7SZh0K9sm=;E3TG6mt2#gj?UPV z8wA}ysMw1it8vlBhV@bkKWh%ETR1iY*8{04w=R7@Par4_wERb1ic>H)l3r=4ie`@tpQFENnri`M(-Q>N;NIj{vQi@YW||m2jbL& zBAWA4Jo&uSclHZcw^k{IXIk9a*mVntgZNJxi-UrVnFXu~5ZXu@-7vmtWxfokwK0?( z0NewHRu##CB*j+tRM3=Xi3~b%tIMncLJNaHj5qtqaXZR149D?lO zwbTcL5gdG$vcAbbVh*>*v0x0Y2i3#MXW2RFvIbyqU;a?B z9_aZCsgWm-!2A1Mzju=WoQN19c9({kS=H_BwhzS>&*fiAr5SiIK-1|bEnMUIjVa5x zRL-0+OeP6<9c9 z0JDQn_HH}p*VFr5QL;&3T15;LE3D_WH$7_E+&uc@Db+2peFBg${6@rt;}?PXCWMj3 zugS=63JmUDMtpK0$RSg(2S&O!o+=ySFIWzr`kipNQPe#ywbLQz~Cj3nYm!Dj6 zFaT_{XT~4^R!7^wQrKo0mGL=qic#_-)hR+rrwR>6y6lY8X{t!*`&<%}FfmwRe_krR zr~!ZnRK{nn>kBxC3kTIEV7yscIo^GUIb&qiFp#(f!HY206$e!ZxCFs%Cd=es_+AjM z+`YTOA~flkXXph~sn2n3^I`|3E&=ou7F!0#soJT zZlle3gVX@#j|CVZQ!k$bt?*fbYu*VIanBRDY5>4hLaA9rGwDUT(%Iy4bOvJXq1cT* zJCAF0R8_qAonh0XJc`nA80xpBNPCU{-3V6 zKzyDNN;mc-d1b1@_3I5{X>)00Ghb_Frp#GvvD0SL|8v$w0HAa=&w>)yV8DN1TD^R^ zjJ$WbSy0+Fq*I04Le@thqaGlOCa3RR`#WBXy-$0H}TqsD9)q0(1EPeS5ipXAMKm znB?|}5N3?PRYeK*gu>cAo2oGnm-!7?&~WJcKMJwMXFabWM;;(F-$(m|eC$d3ypsp< z7vOQYCeu-te_FGA{V)Gtr}z=e@m^wGpmR&A(w|m(5jWS&oAQ~A1K>icXH10<2pJb# z^gbYZZl6ojoGcGb%A!L3q^L@4KD-fILThVIfWc`h^eu9KR*qzuKiA2`+VRgagBS3f ztXYe7Mb4h>eEgAiCa?qmmgM`FosjQtqF-oDuOHm~Ew~X_FmU66Rv_45a2NYg+BLQO~v`&OGoBUjPkJ( zi{G32_xFH;`l0n(O7Lf39N+*_7|y?L3{8M$6!BeP{lCN>Vl@yh0WIKB-hYD+`Cm!W z39f+9*p?j@0|I~ELRJ5djIIXg=)N~t$#3H$led^kM7n^8rKmFj4t&&pYbCWBt{zv|Bq$<{`N?|jhq6!H|z3=0JfmJeS?}LZviJC*+30Q zMZB8QPyl*7pc3~}Zr$m#wm{eaK~HtlDOxS@GS8-1 z>u3wcMTIObP5OY|1%ib+TYyLYlLvrU0e)nGFA4dpsoRKMorFzb5$PMh!4u^mlr+nL zL!w$#Q9f+rBFOvfB36I-_CKDm+;g0F7_Wv%pD^xBAlky%gR6#72*BnUAkaJVS2|mt zM*k79;h?ewtPiTz;}_ltDm&5lz~Qne-B`;_H!XKgQP%)D@gxb@D0T%vzyV?}Fi>+& z;XVh*s^cf58bGkI&0bZ=4(rWuJZl18@R2D3^U?oeFuVdKz#a5&mR?#prMuMbH6z{i zOiEmpDiq*<8j^GdOnHIV5z_x+p4bu{QBPegSwp(fINyoU{ccMiRs+&k;d^e)7~_*f zeubne`M*tfxCW@#V-shEhYk~%iIB(bHbB3}|x~g53^9lS`Le?RsURQpCz6o`?&G1 z7>5RF8*;9xb~D%LIfwJKOKoA=5Gkq^Y$iR%_#BG>OX^rl_GHNGr9;nZET5Nu!ArZN z{#bJs4d{>Agb+9X81GH{JsBE{k9CGuc@-AHv28t&^qn+ zm%_1`Z@RSi?-rXrXO;y`>vP5vu9!q`xo6BK-_KAS=vC1Enj;IC7V@hBEkTKZMK!!; zN50q=et2ezi`fd4JyOT>lyxtGHlq9GWa~WBQEa0{l7V&!*OX!Iee>^{-C#d*FB9mY zvbJxNMA5#1(Gc2I%{=y04mz+@9Yl%2eSH$|Y0>2g||Le8b&M1iy z;SK!l+k7~Cc8(uE%Jw+!6QX?(aBPUKzZs8t%Z&(Ks->MH&7;{TV)WY^G3v|zrapPQ zE+u8FnRNQBN6eB$LRZFiF7u|YCBAm8vbGAOPN+Y=slX;R@?O48{<>QbvD+M&yR$YU zXAi68`&_15&vztc1l*YI@6fiZcUPMl*$8uD4H z9MZuLfxo;;&1_Gt11$wKu#eKAy1yMg4C(JNY5;55WILfSx;ZAYbXm_4Vg#0kRzqT<4hY?(Lh_P-^k9Ug>gROO%mbfqRN8rB(*ry8gEGX z1FC-C`5bwO>Ot&A^nauQYjt(FgB{oN=~nYIahpApyBhH0N86n0L2FOi6W<3BlNGGH ztvdbo#*aQrT&jA7Y#RcVNP6e@V=1mES4JNWC|8@rCIb4uaZ;$er|-q;Wni|??C0>3 zT)0xluk%<05nWAEsx+o7`I&9*`EcZH2XVBms5y^@BtY8kObMsbSohVf-qFF7c@A55 zudvf1y_pv;qvCl>S9y(vjB*~s>dcRm&@9fhu(^mXWNnKg9~~68=nan9nd05JucFP9 zpH}8~*nhF`j|qe>=|c=tXV23)*D;D_s5MDM3@3do7axmvIZBk0&mdQt1~7xz>P0%Y z0gv*YnF8wtvVrAl*iexC?A8~F*RKRm8j*d#3dj2ge@aKl;+u|cTTK2ir}tmod(+a- zNEyfD-8ok*K>TbDA3-8qTuY{$7527{j!olNZjKrbHwiVt2dymum)a~xCt;cMOndVZ z^%Xwb4=sKD)o1UBOmnu36T7suGDEp5R3B~U4+}9z+}_tc{S{lb3<(>P;dyv(?WcG% zp|5ltSnL`4X1L)_!+WvLzO7mVAm5jJ@V-RY^7M1$iOjq3YjwE}a;#j;qulA0txP=R z*U5WmMcO_*wKdi>RficOF^)?fxu8r$Z60bz`P|j$Ji}J9V#JpwZLcC)4^;meYdsC( z79vuoVm1`*;Hf%iq|;}DZ#Tj&eYzhX!e84BSPS+r?HHa8xQgHO&r1XvycRyi`{Q|V zQ%1~rX`t(xlO?G7+BGavWP+BboI7kLqY9h+c3s$yS&%*6r@p@3yF4d%yfl1X7Nv1H z3Tj;tipiULe78B@DA#vr4ME2I^7-37sJ$Y&aeH73+n6d-aD?=W<)q9}!EC@W|APW9 z`VJU;m9(E9-SjXAzXPL-l(6|Kc7Q&}5S?pk+%i0mdft)r%e`@R-108eif#7s3p)e$HblF4w!Km1mPz4%C{Ipg$LsxwqXKMc*MmytJyLZ>=mn6)sz{b8OQtUGo z6$(gsz((u+=oM-UV?L98JpE?{6`2QmPA4a;{B>!G3OB9x#%=0~6O)kU%sU@fEX!iW z;ku&Zu8fRk4Y2YC+?B14Rt^fE zPbtfSD7nY#_mx;y*lUl?+KL7XLQx^cw@=y=`5RYzH3sH4500s^hX|a?Habg;cCN#+ zv`Y<>)dC3QOVt;9!B5qK<2nl~A{Ev5J1!fpdoZ8Yc}L-@KFr4$uX8y?&8Z>Gy1BAl zBHh!ivXLD{H7((2h=a|30EHrqSbkE|F5~ex-2qx(qU3f)-Zx4vX`TETDW(Fe+ zI-eF>ca{&46W&l88PNs%TzTCdO8Z5bhM4!l3KU>~bKSo{hrl;HLtGqOd3-047`=D>iOLg1@>x(aYJlW+qS(>){YB9)W zN-7{2Zc<4szH8KqwzjSEr;|thkO!|iK42oT@v2wfDt>xAJbWlGEBG=p=x5jRw{5vQ zQCL8m(fp>rw91XA_Hitj{wdz<_NA%W-2wC3jh~qa&FoUH;?M$pHgroCqpgUqnqhY2 zIOCArK9VbKWhxhK1P4_pp#1^1l!2D|bgbQzxRk8Q!R8@lRNnMhCCNoVm-srR&1<-+ zwZ-sI?0m{ABZF`1INz2h!K?fy|7A*T$>Za!U|2#Mu#8g-086txmcv-?@&3gONR>+?l} zlkLTPjr=C&72~BJD8Ce4VS+h)JJ_{KTXQQrZ280V+e)z;EUL-GV7bs?y6>9XW-=^; ze3+EY+(lo;e$w-?X`C@(+ryI7zSH;oip9o8t%>(PYMrk_CTRI$3Y;&1Ai?J4ax@N+ zO~)?oD}Fg|<~sM7j9;@8KV!?Yn2{fDcUK6Z%&%UetPfpbi13vIj;W!~`7$ZV^v>;v z?qB%8;ji&>IZp#SZP9$VBukcFLUmyI-z%c+!=nb#YJD78WU!2s34Y59a@WS3$lIcU z%M9S;v@LJsoNsN(t+lpuji|L56ms~5y}IYaf_I$KrMENHJnbb`Qx^6^8F#no zqhs-P3+4@a^gY(gFVG;QKRqt)Yh9XIhO+0Ajj;K;sCDrfKY-dZYe}{3--fo}&x5}t z8VW1e^8FjgmXM8-@JWLFW@nE#B$xRS9V+B{z){3m4%3iIYXWl!-T9;ec z@wGYMPh*IepkGy&H`dvDOOY?Tu)WQMpJ6LyzMA~2){73;93SAw-{uXMA)KwbdlkBI z+-9cZwf>RVOn$(ljI}j~M>VdA3YQr|4~xe~0$E1XLf&hAjq*iut}q(%tWDVFKM|R) zv^Dkyh)5$grs?n7rio@gBRYmxi*~%3VmD5Z9L=xLa6DLTMBKDD{_cawMvPMuZ6(t5d^D<#p zdHvU>)qwJ>a?vqY;Z9RRNdxV*_Ft$B!C!;qabv_05YZ6f(dZDJ6gg$-&i$r@rwpAz zAkWx$C$|WD`%QQHJeS2rGaRtaJJ+sn<1_xo%Djr*ln`Bhw|v``DP!I>%95J(Eg~z? z!GZ=6+3Dn5Wb^jAoI8k#paXCE{cC2#{r&F+@Ux)ZHHH3O?CzukTiip48Fy;cWE_2jhFIVH zpkP;Qm5aJjehaSP=GzWh71Vd+HP56O7*tg*^S*pg-Zpaia<{!y%JQa^!*SXtNje%F;Du>fq?Dy~~>%j!cFb79uODbK>bMpK3-=*+9T*vXtu*)8lb zzytxZY$1=?-ZA&RJ?CxI`Qr+G0XxU&YnIh!(?@S27m3!T;o7p}P|2pC(jow}tR9X_- z(9&KAH63)ZVBEL}M#Tx>3KKI|eUx~twbLNHG?j5q_O`t5zWOd%U4doCyHz1rW1lug zpsJ-E$2o!MP)XqG*~0y)7{pl@qsV5Dg7*D(QLxaB6lIBUGK5Q9&KH4BJ!&o|){cF> zG|{c`X<_K-qN#f#?lwO{LH?iy|GUTn;+<&7y~|LAcsTl18=5e$wzFT#{QaoPpe6oG z87>8~dC>#W(saM8(*r( zp3#v=QX;_jPe}@*o}z~+1ta6ACew6W*M4l|SLMR(#|OI9^bWl<(ImGHU(hX41`qDS z90HcUw9^r##EAI1c8*od&WaP4X6e3vg=Fp)Xq%r3_Yo`A@oH<7`(Y9;itWMj5yhFU zV($E0>I!QMV1-CY_y2O_B>J`!5Ojq*snx61e*d8GkE?a0wUaE~xN_@|>9WW?CIf`h&#B@Ac&;A~|L|m6| zhUp;r2YK4#`+B4ybMEPIJm?1j8HoY}dbGotXjF9SQE zT?)~mzRW(#n@g(3P{OJxli2{dS$teuBbA4pSho$Me4=;*;#;rTL3wL4ks;Zx?CZ7g zwtO}Wt?W;}ne|=2l^pfQcoK(~g-{A!8Fd&5)#r_-&pa)|dbz3Y{2!g1Rs83Lx@`3C zC}Atq%V%hO)~z$I39&X2)CdUG)szP6dI!=iWZyIhD+_s?hXv_1o)!z{*+(rGyEp0m ztbN+K)Ys9iE)j1aPWoNZ=sACI22mZ{7n-?2LnQI~$nN`(S4pz+8wp->?du|a=p%!*dprhXN zW215gDw^${GQO6>jd3?}ilxvOxR#Reg#+}blOoIbXII)!_X91+)(H0Kw1ovykkk2j z<$P@1#R|UEvl1>jmQTBeYQ2BX1S#HeSS`}d-#_N<%q%+37;N9dt)4ZFebP4qSHiPN z4QvUK$`KjbLa!ebA|cG3DuHJnORuAPqprccTvb;I-*iRdgy+~;Z6D>M+Bqmlw!xd7 zsf)v@rmt_{bc-Z&L3ar9W*85-iPgZd<|3hNjy;+QsUuU3Bt)0poj0wOME! z0T=ZhTotQUj>vKD&f@@uRKb+8Iiz*=97VWETRw%6TbuX$RcBlMUUO26xi?y~Pm5=0x8#wE&w3eC^iOsEC6f-(o7lB_(RljfO4~LQ2 z+PN?izRF~V*tfAmpkK~1#X#G0c-KeaH%r19klN+7k?no8CEes{ zvDdZ@0>iG4MV?}t4I}TI-b3~K76~w$p!^lqAk_Ab_xj^e=bz5fhjJ3)<83&;-@Mb3 zGU2y8*7P1%o7U?;Nao9EP|Co3`ODy!@6&yAyJmd6kl#qF^PTnLqKMF@wq1cBE+xDL z9-LcrAXdo#?oUdttJ$VLin zC8?48??X8VQ#a;qzYc;11xQYg1M48$82NOklk7L3F1Il9G2_%$gMW9^GOQ$W?l83E zV|%Xa9eL!eK38?O<>H_pjnPghLONequBl~Z4$35<$ix!+=|f*aFe|OWk%%33%1ySg zb$!Z9wADO)w$3uUl<6sTW=JCgdg}nf`NTDqV@utwq@RD~xe&YAE zGx(H}3{V=C?)>C)s0(!(rgm0M?%U(sHCAKlw25%z1DVK(fK|L2LLap>1F}&EE zr0|lej^qeye#*s{f#fSEk>L#aO_gQrKVccsVJZ%;HeH=C@$b>BN z;c{;6S@0iri%V?IkSwn1^}!!qOhFt_#6VhY7yDuc?Ris>=uISNUCjb?JRyncY{2uw z1Jzj7UT-J%&H2TnD?-EEOtZ3W+d!|RB)fWdKjhrdV~VMyhSNEL-u?(grW@01{tDxK zbXTfS1lPu&ZY$Rymq#l?aCcJ>WMu6TdVH)bOnt+KN5h57&xM-S4n1OPQO-=yi=z|c ze%UN}qXILna(zF*xNsG;GaGHY+%@#rKU686S-Z3Md4%NW$Jj1nJ#DU^Jw8ueRO5q> zy9k2i@kc3Qq9?t+&}GWfj9nZ%JzU2-SZV`FdoT}AcQ42Q$rmjZSxAmW)Vi}G{QCTeaEdvu@Mn7B*|?sx zN5-xaqTW}rU#5AgPd@Uvq;Xsa((jon_c3wnif*%21kK#hp%37Qo-yc*Vv;kLzS{P6 zm#o`_ZiSDIL0Gr=>V@}08_nSM6-QGQ>@l#p2-Y_v^lhLc;6arx&K@CAGM(I8XzBXamx8(#%j|D`(Pnu()|+MGtZ2g@*(~I%;dZVu zHgP~v2uj-)(@z=Xor0K#IV8*AQe!8fYZ$uaOpSss9;`@paV$C>wxROqZT@98X>oDU zP+s@W(1<^m@4n`}Rl-r9v$t}A%Pf-SblvbXiQq2yywWy^>v@xiWfp{kaZ>Gn^Ol?;+^ zBDjLY%bJ-oDW{DFku#4f1*>t#hpaV;NpiF8&nb^qhVHFH0kCI#5&U{Yeq6FLFxj}j z|NS?5GK5rAwK>aZvtrHU78Ac{tcBF%Z>O4e-Dn#@F;VP$U%SenyP8#VQ-wE>~*^;$u89QmFc1zTvEL;T9NZCv9cwtKftD?^kXe1RcwC0jEvic%T1cODD&$2YZ7wL z(HzT^Zrz*is;6zRhgEs*<0KopIARNZhpUtt>f%CiY7;5ZCtH(6GK}p-{<}Xrr%!1I z7VPf6{WfjJR2W$$_8$}4J$W8gxno3^d}HRy_QUURk8M0fGMRoO20I27zj*!7$XQa% z-6Kq5)8-iJ@R!kbkC!m^vjMyLrO42XF^|rld<55@ccpw5hGZ7{MuTsHLj<)2d}Q%A zPP+yZKZYD1e!=;JT({3D_Tk0nkG@={j-Pw{4UvBdmmc`DZ*PAA@Bih7nn8(lJBRMs zF!^n<$$sbmkZ6oM@UpF~#@=gyQrS0OA-+4`wf4DrsRNeJBI$qp`S%asRf%ewuah7c z>^Gn%?=i1_gdLR>8?RIbj!aW=k_6(q4~#1aDn@DF+AkwE1?gqLZymOADw*)v4n?zgB)hzscGR$4Gezfq zkahgd=t4tJ*(~5xsuWu}J; zbowxF!8#o0Z9KlEO#8O4aEc9w6twG^5z5cn`-u5>hlmVBaf!Kc*xmj;kDm&t13HW+ z2)fKdHvM-H`*IrF1bli{-%>NJ%7JZ02haMU!%oWF6uKiC7D`%CwTQ^G{>8YwKhEc9 zz?$!sBF1UEOA(g9W&Oe~Z=hs<@lLw^0q(IapFhn_ze-F{s@3Io&Tb3>79SiZ|$`8b5#djt(( z+ov^+fp3)t*lh59Pap0<-#^w^HIWuly-JIZ5~8qa#}c}rQ}X5gU@#3X1k!gn!f<$O zsT{(<64^09C4-jY5lKlr3W|6ywCrhHE3RpOXStsusChUD<)!Qvw53JuWc&B7F;Kv> zXT)SPPGP_F_WtAjr~rN|hWItyUr7gjdq5h`QT_45j&8e)_kpf6MT=-t!zk#8KQMz; z`%ggpLKjJGygY$z&X$_r7Ch0_TC=!oID&UjZ4adgb6!MO4jRcKzkxeoq*0t`_DtPShrK2}P3R4KJZ*lMR?LboAIhpr<=IwGNg!FJ#D3)wlAy znK*{&BhS(wt;8YEb>UrTQ{epK$QgNv=lbZjW>uS<lF+K|soDozu8`Cjjaq`>$70-Apj;I&?!d^e%=+Do*LDCDhuJ7F{ZExR*{pHLx|&gKM3 zA0zh1q0|5;ie{`@aD~~Zc(K99MTH0XlcDn!pQhBPB||hy0iv`8I<*saEhh1UE)&Mv zA~d8IHgEW*F0wOoxq|Ewf>s*8aDmmK9~*muQottJ%`EC&?SY+{)zf-LLKv?vsdgN> zo{LdbUU;o^RRNiv`Y0L#lR7ac_H@JM?yKNPR<^W4ZL`#aQC;IQ!psLAYpe4F?$?s+f>Yk=*`JR)SCdM|dj~lLop%<`qQIFy zYwpW>DwaPjfjw$+o0quyf1xh0kbr%13Rg0H%v;J7$h2b-o4sKrEr|Yl`^0@_r87WI{yjtWrC6cXp_tc&Vb;ZD(!D^BYC4iF22W+c+UrZ@5lE6R_R z3<-rklAa+o!3CSfI>KYrkUcN*V9)yf)##?Dd!9e8TpD~+o67B?IGp}FSv=-RT0SpE zAc-6~1UF-e)$&3rh12kRnu2XgVQg$ady*F&y*9+`w4iV9-UyNV?K5D@gWry-A-Xre z+|HbN`itL44YArBoJl$WwOnZmo{B=O2OH}IVfDE+Yj$=77EUz8Yb18ZM@u;@7?xiv z4|9WCF;O6{inTbO&!Z{=>5We-*?k|~>UWQ<-5?evwTzKVOPD7#qD4h3)q>5-^Xm0u zzgP(EgY>2RU>0*-m&SAO@p zG8;S^`9mBv;%`S@y0okUdnZ3E?F7Cyrye<;fY@~w#d|Xb67yvl)kimng5^!Aja#wW zZLl>HD?@z`2Y+aFJ^f}ikw08KS2_uOHVD+ zB6as@@U}ZQ{F{$4wg5Wg3sB;h*|9eGsC|2LR4kNIrU;aSbfAYK3%d3~LCqT-bHj%Q zJ+94`GduVEU8p5N67zek;bh}!(a^p--J1rOSi6d3-{4}PTAMWs`_=OOxY~$Jn{${8 zJ-n^5SX$Yki z0=pT7Wl-t~ob|dsO$|LBT(+OEYuQkIc3j{rd+=>H_eWRatgSm7&%;I?B^tB1as1xP z=9Z;|`ADwQ$)l6IzN~vOOyS+)Yo&HHxcf*VPZma4bHM{lV?8aST)3#*0V)Jk3&9+9 zV&glqBpCF|tww6IdoJ(kk;d9KgHnv-*d|XS_~UYoyg5f!yxijiv&GnBH3}8DHb=%hGC*tKY^8 zZTisg&V{4fL94_?cKUftDbcVq^^1|gaU&MI-)<+zNE=VEg`CaC?mR5X)T=~nA@9x6 z&*Egp#7l@1$3@2%z1E*!zWJH$RDXMV;EW0K5KZKB-hfqPcnu*0N?|?t4e*gQT)@Po z3BJu}$b}gut_N!K6%2bDD(Le_(-zu(8>f!#+W!2fCBZNARdV98)fAd@^X%80*wD}; zxe|I|2#6P3m23O^H?(jgk7QwOUa2b&)7xL-uuT`T2Yi}N<@WnWosHP1r6CgYIygv) z`e=T`37J9zTK$Lh!eG8aW6cx&C#8Db`7Z540aaheJ_=fOigY~@r5RJM;9dyj(gUM4 z>(-^#Q`$H^M|<_Uz$+sU51XM|?c72T_JE$QOO8l&Ud`K6GhN&6Yt9^6ki!L&`mPE zoOE#ZT%#mwCZ_mE>Du^OFl03~?kj#v6vA)f3Hr2cX8Pq>^6EQ?1znqHme>9QJtZEN zNwY^wgUu~-)O}HuD{s)Qflco3_4C>x!t;)ymLC=+lupL2AUU;d|Ks+#vxT_!VG=)> zuOaP0UXQ#lPd`)Hpu6wflAd*wgg5d%U0B+Dc;of zSsZN-@G5lQD_hnTdMbE}0g|baF;YGbnXi`udSa?GDdZ7a&(J>A8Zk%Y0tpXv`DikR zztKLQk<4H3qgI%6d@lE$T=e~;xDU0(0xGuXiBFW(Zyj0vcH_X8tGd-o`r2-5(!3_- z!4^~a-_ z+YdC`6AxnhSz6O4_{OKWHvg(X2LjtC!|5hDRo>2q!HAg5Z8D>QHqXnDdhc~M3g%O> z^v4OfpQ6659dVj}?2PGOQZ~q+!?0q0ctE|Yh<|#EzS`c=NOxWAC+pgH5tdKs-6yc1 ze%`jQCM5kWRST4_o=HOZ1dWgr`Lw9H_|ASNr*{0}%z<`7@x&pr)~g{n@JEKo?RDag ziI8t{e8q~~f$?M61=xJl5Ct=M%)IU}j7wA1B-j|X998mLz2}rOaP2FfbJVA~zJ4X> z@x8-&SRZ>?bBbtlQ~g2o>5JKdzo{Sm;LiRGeK+?V^jo6x@oH(*(74r`)*A@lqIc=| z#i9ZVuM5nKoc6w+$SE7_gTB{X$YT?%a?VBp)|vBZ{*|w6KFP&Z3k{`u?|EVwe5Y{B zyQ=E^65_=L(>C8m#t{9beuh~R70&|VWZ?d*N7X&2o=PNbdVmSXk9 z+Y6Y$XZc$SFT8l0_0Zyp`-^{ZFfBMa)@{`!otjMGc^FZZ|YOazty zwKKf@LEaSK%v>vvIib8VPzI}*O89N|BvUpMiGD)aC+*@QiVs)RdJlc4E9*EpIrFLN zT3>pKG&&TuhBUwpSVtZi8E_Ed>p=z_J*sx{92+?FjS?3|XGc}97FM?_-@rJgxHA$# zZk!at>#2)OcuQR;elrTgGv+QyqA_S0>zIj)fH`luf?FG7D)@N6zxjg5jwO{|YeeXz zQ_J01=4T9s+#W7pK!2uUrT)%+jf5|Fy`3ZNjD%}J!E3X$VAv2lx-98Ce!xaq=qArRLoPj5Y0XGEGZ zV7>_|q%GCFWwki{U>K`8dnIri@>{*(xViPTr8DYLK89EqO)*^3uehZHq?mk~ee0g{ z0KjJpx%}!9msEZXoQl_S6a*BoV#|>s&q`8g#-v?=5)q9P-xgFlwIZmN7!T^{8!{1s zwKN>{^5&v^fwL*}v9`BZ?A?aPp3s-y@9aP@lv{n2kda7`JddbM&zPidB=$_1`^oZDF2Sc_+&Xz{-&^DgxzmGnu?609ML~%`o_FI>O+NZX&UvueUyc?xLgq9^NwZ zl_~z6zc?hxPJC@yigHU3Ix(Ps8~ zuvv=qzULuWVDJ0s`1s7HwTH4?78XN^tb8>0jQ3;XMfGC$(;LUc*=H`OE}6Q4@-tnb zBtr$=N(Sb^#J%LHpSoMyd)&W}8c13SpU^3>3HjgIwbJ$*(pM!n0LyitU@$H{uuH#%=v_aoMFU4MGJc5&XG~{3c}T-qs+{Z3 zK?R%SofY4_=F8eccUTk0d~B=#kshnye0r@n9l*x^O<=%LMxr$ltZkI?QoK>bq@q#x8xuj9>t0^yPaJ(DWi)y*SU>Hch z@zTBJji9oU{szP8>h{%0Cb@m*uzyYZFm**))XZ<$&>3uT%H*3{EZYR$KCmbgIuaGU zg-}3ULh5Wr6$gaV?n)EHbVLR02zz*3jWc|y{-P(O?T6x=dkbrK*DUyFpbtvjmjpu_ z&B7iubvUSXjV)QiO7bHfT#P?woNCQW5CmW$>nil3?k?VpZ0x0eZ^^Wklk?wuI6%2B z&ND;XZxT6F{m{qtTCFb;yE2@0!&E-=2ssRjA~tC1&z@S@Rl$P?0VRZI#P&3}yZgd6 z$tKS}FOy&G&cx-ilOg-{zaQPo=iIU1dTKr=0>Ir6u}Yj#T~}cPd-<^xd&&W3Ti{!i zwr$tGS4Zu;>+_{`sq^Lu2d`2fm*tCjLq~*tjeMSOp+B7O|rlV=tkQH^Bt&JCEJLZM{MT(WLeuk(!mGeRxaCG|r3 zj7>Q?gh|q?UwIND0c;g@Wx2~!W@oN;xGLIG>H5b%3jGJ@Q`d!EplQvZ+*l`8>37^^ zAg0u{-c0>XBYFz6KUcf~|&>KaBWZCK>QLt9tMtgro&#bTk(IO8e0yTWA}@ z`p#CxEOG62%S*3GW5l>#1$a~I(nyeg4b91mc%B4pc>g=-;T2_6Zt85lbN=YHx(Er`xSZU1D|E_#{KzTQJOwWxMSjzlv?9kKio z^ShbWpT6CS)tZUD-lY#%5kGr^6g3a5)JUIS&NfD*XEiQ7eP4RyqDALa)9$G){_}+YEKG}qCmTwyw z$0`5IVh8w0r#O&?6DLr!{}0c}8bSq39vW5u{XbmfkLm!Q_iK~pIV(P!@xQ-REEShh z(mXZ0FbKfR{?kP-a90s!RQqH{fdLNppBw~Kh}2?X{k-DJX#XUM|Mbufz}>NN|G+8# zdy}5+u$2P5ZTmd~kM2L%{jah3l#;acAD*${|MWCqH6QVUk!j(jFs;J>a8bw$da*D$ zrLWNcY!dL78e%v#jXGjaxu5@&AK;V#+tU!ALCF8?P)jbLb8NUS;@|xb7g55e0k#XE zHT{nc9R&fMGY8sbH2EL>zz^8&g!ljIzzT9gSPJ#8M`XDKRf;hL1-*Fe5p}`+zathM zE;bGwo%6p#m_HXSdQc=cJeU(4iHC|VY3{Se^i$LiX*c)JQCLxS8)bErQlMZp3#!-h!an(qafZg&G5jt0G`cm{`W z(|of$-INGLTZM4>3sDi(q)_Q5Df(oMEn|#Niu46iJ!B<+}ob0T*~ zXOrba-a1IM@gNj2x?|W<@A9R?T;8wmdgm8H6roixi*E;GbhU z_UUC<%BJCm*WM4LEK5u?6@zxBDyn;J&TH?bcHT=~4)QQo)51$oUZWu@NujV~#Kr;B zNBx!BaH!Y`{^&9omJk4(-o{JemYPoQz~7xW;)_^dJhL!1{{Wc_(zii6FmJy-Rq(-x zouh$_Og72hsG%W#^JJu{qKIf~%#5{`&nABqc*5A4^AdmQGO~vts0ED;l)w&zTk?L$ z_RO5uU4!_t+bn68x5#Z{I-A%$(QMt=a0dl-uUYpUlkU&32kp9Fsn1DVW0k>rSI5s%n8=$yL)(EV^&0=1|Cys8>nNo3zPq$5A>G1^3*qEC@@;=IN@ zJ&IdvnS2$3>TqYE>h!8O$cMAxtmyhDlG=N^o4nG}3Z`%Cxsne1F0Z+B@R&JClY}AO z^zveo&^efgA{4@M7s9l^) zb*&s?d)a|1UqTQd43h?%sYs{_!jMlwNDdO7#s$$c;%4_AqgBp?GGT;ggLpND0p{JN z`OnOQtz_1f2FJas9(-Yce|CYEElRAQYbWoNrXXcq^Ui>;3h33*3U*IrnYo~Vba$cn zjFB+abeGX@wuR_waR-L>7ff@@qqtSk|5^z*#YG(=gb*b$W))+7j@j1n<)*L<7 zsTkdu;8g8$J)pyJOxg(Qa4QJs|1oaDnSY(wXi>P-kRDfqb*Y!n4QB2#3OHOS;z zNg-U}fAN;T?!vnX;NfaA#7n})60_98(iD3zjE)N0^@X;g%3z0%n8ZGi(zU{uXrsxn zTHwqwZx2&EXErjBdDw0DSASabqoE!8z*`&OI1xMkTT(LNk&O0SHPqa3C0^!HJp9k;iMHW_5KFVND#l}X{`a>i(kn!Ye` z_=0?BV1s4-`jsT?+(qF^7oK1<2W2hxZuT24aFie}yOJw-opSaOEts!sHZAKbN2i@K z+rdDIefQU%3L}p7$8}`+2^=d_e@GH$O-9MQ9vhhNxyvdMmDe3@w;ypHryC*EBmr|p zHT@}&2a){jHad`T9xJ{M6NBK@uocH8Ki7;kn_ZgZ4jE#X$rSoG_S)IVe?7-Dga}J5 zb;2OB3XaI-#yoe+PjRpDXj=(c~vX5@Zml7mZ6K%eHGuBWWI?+_^-WS~g(}rZp z+f0l-ZD8yi6)rQ=gMhdDD#t`YE$IPz;e#0yEzPym{!Y#T>A;`#5P>HhkWXumZeI4l zsVNyI-e+Y7E7Y1$1zQucp*eF0Vv|y#a(@HpT)%q#x?hs%{*OG40{vOzMgTc>GKCdk zXVUNK-ps!U+%54lwPklkhOR^}nMjfnWMkXNJWQLv3bUM5KVVWVS03XNx**EGH;A3* zGCH2-R_SDcn-HgicO@bd#?1>p4L4IQH|!eJS{2w%2$pb1hJUoYVSO{*X~WsY5-~S! zG({1DxX@;tNGZ5pL1gw)Rc_YS_Yix6o+S8DRb+}d>AmCGA}foXJ*`bWg|@GB=Y7(Q zYM39Kpv>GT%10CMa91*LD0YM~Oh$m zfFmCHfEA&f$u_cEe_)Nmg47SALa(yQp_0s))2w1E1a@}=!s*aC+(otJ9(`?ZXo51( z55eiE3+`FX*l_()Y&8|M74wE(>S!nVpe59x`d8vw(&{lflV1k&8-BIO(AK08Snv*4LfU_bP?L@SbJ( z*Hk<5uvtX~0iEKZy%1IO0E9;^pR9RV|U&(dw1A}J! z54|y(E?1GXh__L~N~l`8#%Zf-&qcI0kYu*u$CdxiKV%kw*9o8kG12QOa@Cy3vYX21l5{NUL;MPXPNfPz}P~*myS?5mUsOvwV-8a4>MH z{;;;2$*a-7T&f)mT2tYqs8fEUIzF^Y)veM0Cgbq z7hs#1=WPX{`Q5+w16j_H@e|){6UxBHIX$YT1h{e&n(iz8uZKw$TnO%RNv6j!*S^AR zgFE+e+ye1eB$zUyCo=%V=!V^^gNqORn<@_ylLAh+7q8hWT)N3sVBdSY$opSi&D+0U zJi~bD$a}UNz}i>LllY+0D8Uz(SSX{i$lxdzYs)-$n7+i4D z30_Ml33XL!5ju|e$`U^&rj18&kFU*$B8_GiO>l$Pg@D9!OH;5cO+Svt;NsM4FxEQ%t$0$3{~h7@ZN1QY zC!sr=wDKsP~tJcf0DtW;N=%aAMV55(A2^EYDMb}$65HvQ!C!EJJO zNe%Jyhd=9cCYW6M!pv@a(QIRUFN1YPkQLX- zzj*hDNPWV5dYS-C(Ix~WWv z-u`-EmRY`QKzJmSbS>IXO3H{0XX2fHP0Gspc+#1X^~X$pg4}7Qz5;n@{w@gjMBK<< z$TtHNmPQW@>Ku`iqEE_R97iJ*CJFoJ$p104q(~Xw>C#vq=}M474EY_#T-hDw*QLl> z6gT;bRwuim%IZg%(AvM}J!RZSr+hvAoS0Ttr734y7iwfypp6skM8vF2Tw4o5*2#C<<_zi_ zuHr>#Mqu+`xp$@{*GizEw%wMIXF~(M0|MaK`KySWpi2vV8DzY^N;OFbCatLl@*oB=wvs#7kKF!s%9~&ea&G^ zB_>RjVK-qkE;gVmY)FF72Mq_4(a2(iKc9KJRG@(w<9tT#QB4}} zAul^&&UrIx2geLsS^#O}9W%Q+ZkokZTI%hVvgWM1!d!~DRXx%yItOMxEJ?hH7t?sp zBniAwB@3T%PD&73g^6=dStJ^+=UVMT3qnraF436t&+b+6jbL9;gNmo8wgbGYrs+fy zIRQh3tn6CUP>Gm!n%YZ-Mb&t)@jT~vcV3fZ4^4wx(YFhAC7BbFv~MwTgP95ds1EK5 z*UGiQGd(&|6)9avOKZ2)O?#YkW;XHqs1?<2HftgO{a{ecmpwQDe6C~9W}yEN2JA`H zc9p$6VJ_u)SznwK9V>Y*N9Onf-*`D6pq0r^sOzz5U3tIMTCY9 zd=54i=ACbCq@>>UT4xNZ<2}`Xt5v=)m&fOq&H>$>gwtGDt*1DH+%1pPET(Hb#)D&>SQ68^GA^FPVO0;?#eJ~K&IU?B%%!o>5nyoV2x(>-}MP! zkb-wo#)6Y>G6+MP>n#7G8qj;w9t`%?JYMqUsFFovM&zMLsJ&r8XILB4Tf~rI;0E0Fnt_wmxBHl z^TtHNX|$GcWXJH08GqOw=9It)aAbR3YH=2)Kj|xDF5%yu!^9pZFXK*6U5=ZFb^MVc zD=O0vZSHTv*{E8Jzd*8D~<-Ui5_CyJztp# zV9Rtf#~Ej4JCqq~V;|0Us^8}G{M}%A+Vw7B0Bz|%4(J=$G2zXk;IihSmi7B!AJ2ox zM`V*%@NBHN_H;5;l)p9)=EqS^zG#SqxrRiefSHw#DrHHC|0Y|RCX&3L?Y5>0_@NY` z1;37!3!Pd7IgM$ilwk;a*^@Pes#zfn)^Te!n}ggLJ!_x0>S@ufr$<4Jhn0{R4KXJ3 zEszOhoP&B_nr^MBz5UTsZB5AdS+$Zi`-#$OWk6i{rKK~$ct~91D);=2SLtq9b;Iqv zUr3MRC|A-!e(bzZZdF`)x zP1?IA{3hV-5|*7f>9S8D&rDk$M_25Nv*9@MP_4s_6`;wA`CN1CqX3JJ(Yd+}i)qYd zJy-T&^OVYlA*qYjwG3^~JUM&9hfK?nCAGzgY`^WkRQr@%6+CaXxoYf>5C4D<4@VAT zcEe%MuifHdF)D^88`?sjCSm4Cf|+xEx`FgLwRV@1qLuPX_R4O9)~GH$O&){vHianN zfBXSgh!o@H>s-%T#u_}^KPA!W1icTF(R`}P<0PAv?V3k|$+nJO^I^vujlwzg2b)u1 zILJiEZ6ss9!I4$1O+$d&MQp5BzqpofMuGg%!IK`3b&W-cV`JFG3QqN*;41eL+l1t3 z+gza+jDnXDsreR2(=;xDY!rnD=JNO5c#jq9)b>;TiSmT}6Lw}0Ef&F4pCiTQG=iSm zF|vdKw9S1+KiSh`-q|%$EBFT9q4$=7zah(q2TYACBsX-!94v{-3QMD7U7zC#-wY3_ zIO|cwAgWd;DIR*j&F@D8vk7`aZ8Mj|L(AR!1j!$FMa;1Gkv*Y`W6yle^BS#Zr^Y9- zd)UIg$q_KHvI|O?rFM2&SwkDR>u(Z7(DE1dE(vZcH+ZfWQduQx->vr{8BevfEYB%j zZ$Y_1(9Uw#A%iV9gSJXimcPRH_vP~}a?>1L9NA`o2P-uk{ba21Gv8{!*saO4h4eap zYZ97sLbbl5qXLZN-268U;7!=cjkby(WW(B#@s8!(k{wL1MFREh9b1IpVn$NDG6PQru<1E)VfNlA;Xv-#~+t_%c`pQA>R14tqSqFjc9OR(uuyF z=T>ujWrR>JlzJt~QTAZ#Vsbsf!*LcS>kt155036e{@g+WP(oj?0j~_thHb|?yXs@E z`ljW!YK8MFlj{$8)5#TwR6m-h>;+#XHEg~wTu}w@OqX0;x3;J^+&~w=y0a@1sIf6V zXj3cH*7#Y1|LP9)|Jq8(j+_iT)U1_k^Qo|uiYFV}y7oTo3iq$rpajaTU(Vd@^@9=eNd4AC4h8HKPY=DIO1}4C{#dQwra-XdyRwI zBgHZ$BWx;-4-q2W0#Pgo2lYj^E# zeN{ogaRK~wYYoOCseRvhoh(91v`VPeCcR;CQo1&JUA9a8w2$+|Qf1?Y@ny3hjDxCc z>r{-pHymg!YDrd41ixjc(FXs&05s@}WcO7lZ-mBf6-vzWWeEP3cc@S^?Y%GT_=XLo zd9F=R=%J@eBsB;Qf1F&7;4@K|Yz&}7tId8kSn5EDo=>rjnv>fM2hW9^#SYA@#kK=u zU}0@rvVjvoxr?mGGr40>*l4?wjFd}bSO}GumUbm7gYE#MC)3-KmFcpD%Rk%2s^y+= zlW6*p2gKj+x?{ZEK2Uvt5wTBeOa`(Q8pMX5E`M#nwhQ~Q zKpV4EA0pw9BRU>kz;o_E{l)D#Gb}atZ_%#}L+c%yO3DcxaBiv*IS>{o-_jX@q9D#e zx)E)baQ!ys7IUqMT7pKwloWz3kV{n+LDEowWVc|&{P`BJ4%9Fr^Wh2p$h?~*SGzpD zhpu4CBC@&Ii42_fy}1WpQ)|9dd$Mae)3ODW&|Q=;gcpjMyLl61HZ#7VA-vlS(isg9 z%p0BT`VXuYUG*kt5C>le&!^~pW8*OOBR~b z5diBUGrK*moN21uzS?!2Gu(8 zEihAg4v{B5gIo5e!qR6Dzlq}HCLzh*g9MWxg@a3zPnFAztkB}@+r+Bb2J3BlQ+m&b z&m^YKCbp}pw+Va+q&bM}lhv`r!6p$C2Q)`@VEH^U=VNTbzO)M7%c1O~MmH0c4;UL> zJT|+o6}lVE_%hF!wwN;|Bu;@PWXZ^TiATJF{t9R|P(EiJxt_lE1_$Olr=GP#&8Gp$ zfV?vQzzJ$0uy+hV!rJv=rXo#jFh}f1UleL~71+_&K#B5%V;R~^2hS8B>qoocksYD^2$n<#u^fwO8n%ectqgr_m zYuY?Mk!KVSiW>I?2?LR~1_OtP^8dvSwc z9~QF0ZtK7Br1T)lAK%pGkMT}JeosMHAv?!OfvVRkS>rkoH}GSln>kN+Ks|%f` zr|qE{_1)7d?Qr`-v2Y-MISxp3RwE<2KF9YSINrgl9c<>P&v$@k@G)n1A-JVJ4s-oe z*G?Gw*$oN2>_0hPVK;nnJx!HjWtQ3S05XJ8Qw;rG*C{!IVHUfUt1>fCyh|)T54i#7pX}ABIYytaY?w)oZ)@}SBsTW zyn}0Tfh=AU7A<}5Z;x1|1P-*Og|1L0KRMrC7>S`qESybBqv4mt%d@FeGo#hnjr~hw zO=qZral=GwTwLSwUffyYvs}P-599X>30O=)u*p9JP}9|Bv#-6aQ$w>MZ>*~WgGtAi zaAEjVcT;jm^61t_GM=Y?ojD4`VhZisVW(F6VE~%hU4@wq{@R|hbjU+9>kX6U?JYqZ zyA>D*@h5zH13 zzg)OxTy%rsu~QPz)svGUI_PhA%QJE8yH3)vRv~}%w)#^ptlmSbRY*GuaNY%e=Z)Uj zP|V6k%4WqG=p!0dhX!4Y-1K-SZB+aA%CCe68g6A!)@IVP5d~+s_hDD7igEiMK)Zo* zfOAB(W*b%`isN^GtK<|#2Wvc}+mNu5gX+=y+xuf46#{=BF{_#{auRMqwaEd@9GrgQ z2-gmZI!qwL-V{1Nhy(=1;<|~m^53Qis-)4tZX*#4~dC#diEb>6~O@*-~RWOe(yWsI!9I`BJ?wO z4Hhud4Ys8R89ytaUWSDHpOqqudJ0em0{|~!iWFLTj1^f~G5QLTLI+D-ZX3XjM?ay1 z+V-?{Q!l2F_B3c9lFfd344GSjK#D31q>(|?SH7<0FA=Qa82?G;RV%D2#0Qp}tx$b{n>bdy z6tTf)-`v%53tsz>xsk#ian^>*%nW+{dpf}`bAF9;xmn_6?xuOH7Y5ckl-a@<0hkC; zouMhC1c)^-+=4nU{tz{|J3{|m<|^DH%_?h$a$Bb2tNU1Ct4kbI1v?)ozo@T3d?JnY zBwCuhVad4!X~INj;()BT^tg$UIkPoV_qwXhU(A_2_?KB3Cc@yNRGf z#pgh}3k&0X+bt{T|KrTb21&>B8XY2mbCtUA$>njq6Hdymrzcho)0mF*P5LDJ(2I-m z?#m)ZH6hdF2RqVWXKOC{9%c_r6xt*~&%J(m6M4HHr2FQr#nISj7!oeWGYQN4ki~UW zmJc2gX7%p97}eybuJj*RIUy>1lh;U@>Yi{L?FL_Cclb?DXW$ z!$~~IeK%REWczn704~xvumX$ez>n%xFmc#pVM~;C_s<8}Zn2HV-;uC?19m!)dr&Vu z9bsIeEE<@6I*jLG2h<)vA?=7P2#$H6mM97?c4Y%M`%`Fbgf|0Ii&mZ;UPYYdP>{!D z_z6KDa$p6~0~>w^T>TT~wvWhVA!g-?krKcFYS>+BeZ<>-BOm_Fc3a+2tz<5Di)r$z z5Eh?)dfFdZb=Bu)G{M4XGG7?@*#83~j5j9yAp+89Jvw!#T=evd{_ppsyo4227UR_| zBSVd3T8r#7Pr>!)byx?2>SL4C`DM&ktMQbdf4#gz34crEo$xTFbb&niMYz=U2N+#p z@R2#Dd-8zyxk;tpy}|5u0Z=1$mLh4i4r6G8P)U~fl$jr63Jvl4M{nRQO{3O;%52xl1{Eo?(u7AsPDdVi@{w& zVw+zx`uM8xs&3>YDj3nZ?&xF(~=B`#QbJ zv0xH4(}?T=E#R!S)10!sn3fXc!?H`L(HdTqZOKT5AG6QXB>n9+r5DHg`+gIed9^5S z)DM!xx@B|Eb_9)1FgY7)JB!_s!n%!t1GmJnp9OVT2hOyWK1NjgE6we*d--DX_LoPr zXYzIw)Y)+y)}l`JS`zz#a8KX2b(0fg^R(scR!h#Lw%&Cwyk7;mhU#STV$}-$WRZX> z0*~zH6H>kiT&~$sjx>Z82P@ciozEgCaqLvRZNw>S`PXZaldQt_>Os8 zqB$gG3W0X_K#|42-|nUMU>2wn*nEzP)VKvLC}B3x50z9f`U@YoKX9&Wzh}$q z46-fnD<|Im#ywzQu2g|sP`ZT=lY>hyo4(+(k9hA17(uz;Y zzw%7~8^4<6f^zVZu-4-_NW54wWlbHpOup)Sxqy}(j~KWL-Mkqm|3|@s?A8CmBzdGj zNZc(U?N6^Cp!5Ihs09i*hRxGaaP3qxZa(k9T1m6Hw8U+rrR0SL>DWhm@elQJ4odO=gIW_o1VL|Rh>*p{|K`gY83Lh3iQR*@ zWCqRmdykQNf?x4w!Ma8^z`Nd&e)RpPnE$#O&~u3&zLB5bAZj!6{|B)J8h!=Ae1>$4 zxYQ|NBx0MSx|$5dB|c&3?=K0P_L%6DUGZNq6t!wK_^z*xo4pw17xaUjCTk z<5_`2OJ*fxnvqR-&wKwpvD9bjW0lMMrM`obC!CVtKQDeeiwY#RbNkcD!M~>$tAUZ5!%;rAWFAp>S{2roOD<*Ud7V8gg-&2dqmN2F0kS8*x zd3EkG^d08kgMjAF0isdr|3y4Ph>$`L3%ub-@3X31G^r??%X`3lbBWri{_nhBfLMUJ zDjm(}e_Ru2xPN3@#DGI@@5v8(uJpfI^zEyS4K_SokIL`d=gF$B4EwfTGlzx;d!aH< zN>}K5Csy`fI9;E3Ub43Zb}5e=RC#T|?gzpM%69|_8X{c8BokbWF!&e&k_3zxuoPLE z)gF>qtX!z(21QdJK9>sshVj6;NfjeM0=4!2V6;p&X(sFZ?qw!p7n zfl2q%aTz(rsS4qWAA%X<`K66w@YcUhz+`S<4z#%7I%oS;Hns2wnRuWM)aIBZm9<>Y zGr(p3#yT3;8LtkBt)fJ<`yg>PhVPr=80@oF_Yc5gedNF3{!+L=vc%JD(H$OS^sOm) zP#e0I;;o2?bxj>9+pLHmu~et7%PBGxbk-mTpiQMgsOdjY(J%_am{H5-*SCMccigL1 zthBfpvz#T{cmy+2a`g>RuMtULrJYJomN|jSk^|~ucF}K;tZ?OKA(&;tG@MK zH#*3ZM=atPSGsoy>4#z;pK1&6?>ghG@4T;YPn$4CXEII+`-N+{{k+W77o*!(75i|6 z%*)`NB_@1NkmqC8A%%B*#w7FI!uee!v>#kb%{+t5W>YE#@qn|h=dbxv;t;?Q-TQ31 zSR&-%%=ad3$jPdh1t7xJFQ-pD^{JXQB=%Hi6E!sAA3JN)U z>(@QAPYon7^RL?}U}HbLIrKlerR`QtFmj~rcK!ONq8o6T016DT)))(pRRu^6bA29K zQnqHhk59_tL^VT>`!becp=3xOO3$ zuX9Qx{YhgSSsdtpmb00;VL5r$AQL~SOy3TF_P6GmVW<`IhWXx8UGl~LV#j`a54st7 zfM`9fBw?L@)1I!J*!j3+^ip7Je z;)ALX&VlVf)Jr9)s8|wu+!_%N5GUJ~-eX zxJ;oZ*jZQJiKD0^bpYq{6@sp?W^NrjZ|BKN^Wm@8%GY+(=&To<KYF`AUQR{`)Ke)s9&M8K?Tht@{>!^>{eg*Wx?`NvQUums@&n4DbZpeY~AmZ zr~GDzDcz<|HoRBn^iJV2(cxX|m9E6xcY}14cS?v&G}1O&QJ@0Vw+h$=~egz7J-OMn?Dby8gM#KbG9VCVz87&`f0yPgCR79{rPN|k}T*~gDg8}J)4!7 zb&x&Hu*u{R-+)y=o~7T$7eZlV;1>`DhSfhQqI_Pr41ZJn0*|5s)OoO z(}=9IPAm-w(oxBO^)Q-4w(r#*6pR>oM`(Vg2ZwnT^V+5e=~?iD7uk8g{?Y97%%-HU&@k`vReg0Pqk{l~RrXgd>ZDp#Scw|vmJFjaS*!CvC~ z?dR2m6=YT8_fD@g$5M}rTM|tblU}Pq3FGA>rnF&D!6k&!rXk5Zz)XV)_%~R2nCXR{ z*sLWlK<;=M1Zn^py!v3kS(gQ9|@Vp00*wzOedA+A8m2qS@Al;ZuL>G z%^O{_fh@V&!>OyTG*mpN=Jm->Tr}nX|>??6sU* zxbU6^$iG9$rPwL|k;8K$`A*0#vN~VVY{Ojnd~G($oS59LgUt}G|5QZSQ1q;v`qlZM z1ismJJiPl2@w1HR+9W^gJLF7*mOj@6##YCZ+GxvEMw6Jr`uBI@;|=tlxxM?dpsC#a zphcj5sGOnRrpQ|mGqZ{;(F4zVQm9;<2i5hG{puqggAVx&AHcnfxSGg0zEem;7D=wp zp_`4qf#T7ib|{7WFpKL=2$z!v(Kx2{zTAP@r{&tfVIid^SPn--lo^Np4MJUtHzuXa zS@pXol|gr^hKCE(aRGDKL>N*)v^)_R9Tj%J7=HfSHkD@GHU>?@Q0KwK1B>CRnp=Z4 zI3UoV8_4`!uR3bdx<%=+FYjZ6Y#c4JqDQ_r{>?V-)fRrcU|y~LKs;-T_U#e_h|BI*HWz8v!|dS7GdJED0s*GXeg-95HwN73Z&Iat z=bk@PC`yFxm|7jB$$joN#UwXvby|^Lgxm=RVd_ahn+t&d?2&C|p*-NCq$)1#d^BJC zE<2>o0>xsRYg!oxy>cx1xkQVk1u7nci(795zukS5+><*YM~Pw1eE!jt)_~)xDyswP zY`pDCsB!UUnr@@Gf$wQb*l+^8gI1gI+nMg~R#ywv426L)uS_v=FVg$5^JwqBozK|p ze3N=U`YDtAZKuf!^G5!Pg}pEChh+jqPd=0?mmrt-RnG`WlkslPWEKC@>}-pWs7{^^m>1hbk_*J_WeMZvdpz zhe)b|CUvhF%?adeSpX=G7E$T&e;%Ei+`LBzh0ty_difl9!{_1Kmzh!`PO_bBh%3uN z#0l(9hNl>)Wh6dRXFD2}SfYln@v(Pz$+)jof~3str|?8s#P&Ey+bo@MJs@*o<)E0Vz} z=c~AH#I!}DXL} z?gI-%wE~ozQT+DsxidevxU2Wb$Q+;0wsqp@Q-T5+4X_ME9d0*&MaE*0REd51Bq6IQGJlkkjSa-)y|{*pQmJQ%r$!b7XG&LwGlD|;>OVMy4ufb>tC9r z=!x;UY542>H2a)j@B7eowXaN4LKSn9%4g%i@U;EQ?6AOvkvP@a1zaTbE;3@@(c?|s z_k-(je1&y9DWUf-&-Ue~SlgT2diydYXEppB$?NbCEqS7|DoZu$kb=>R=kRu0fNabb zykCe+Iwqr^Sm?dI%53Y}sCHoLD`Y2ba)$W_!he6+&+U65><8b?yW!7fKCrPZYI`T* zTED`*5n3Jjez7d?!0B{}2y`NZq7LC^73JYSyAPXZFg&B?8u^eWM;*~va}VX8^iR~} z=+_xwpXerF37H6-M=7Dhse~YP!wdiD{!uX}3ZJ9_V`zBRg!Io%ph#3B3?ntM4{xMS zRDFxV5>XD{ml4e{y~DU+i8ue^^?&x}I*5k<%6A`9yXT#qp5|~^R-XjK z{1@{xlF)yI0SmwpQg?tLok+|8bS%Nc9~k^Vnth1Ocd%LFSN^!=x(J#0GmdFyxMUQGkxc61f!C;K;c6-1XG6-L*Yo& zk1X+G4go7hW=>1pTirO=XU}Jc_LP}S2{s<_6y|sJ_to#qzi>2Gnw@&Vw|gh}_&sk- z9dBnvhj?%69plQO(O-QH^?T}x=w=OL!;@TyFgtkHrDR&~rIy<%v6pT91eC$8K4?OM zhzRndNuIC-ahXnbUfhd{a%9FVrF9S#{HJ9hwAV;UdCL|-l}&Vru!$)^Icp+YTi&ux zFJ*se>*AVtx0@lbwFA5~tgJcFTwxp_OVNDtj>CSVq zR$pV`4)COHLd}96Hucd^jdz1SVZ488>l&M7D7c|Pb+*vBz+q=OyD*VfHW99!bX@!3 zot!mNc02_j_OP{X`t#>X2gXzBxbw~442ujE9vm52VC}a*5~5lXDfM*9f$9vGtqb(( z_ByFnXI;Q%z+%zrqPDel#iF|1jrLixj_QXMq8$xsvxrhJ3^e>VQgC>9vbZ?2v`=sI z!^y04UiS2{?^F$Mhj;MKi;taGkAjn)N9m89BL?F>OuN=13|q{5*y1OOTL>HO;5v~C zDd75uclC9R-cXIjQvLe2;l3?cIMIYy3z}yfw4cOD;(ScNXI-y2I?J~chKc;B-; z>km)Vs`vF;SPfWYWdZ*6!@oZ+y|;(Aq1jdo9}P-8BV8aF!Io?F)jKuzR>jXm-THd; zXsrF!%Yxi4KjAhDRjY9Qp(}h`%RuG!849LHC*a@i9?+Q|h+EZciZD!r5N@lh)x9;C zlPMKW%c2vMH!uPqgF~WSCDj;~+U6E)a@n;@{Hm8TqI-C;B|7hv-AAw1o^qfN`1MRCJ7qYE2-y9}Og%Jl=<_ycK| z5ASwzn=d_mN#@F|o>rBBZJ%~e3%$q9)b=238pXU_pFa3(nEZmTf+>4dkNHSHE{)Xe z`;ulA$KOW(rVCFpv?8#jAKeBpIcz>XNSG0Bn^cKRow|#{-IHA=XV_ZLr7tSZD_j>i zJ-S#GJWNyFHBR}cXcwHMDOahEk@<~8m0T_hH_czgQsX%{zQ)b!^q`*Kawc3zIwDlI zX*w0PE@M2namiYXaE!hy5;4Y=buHLVl32H}^6wY8R_Mt!`qP=qqabK|Y786oSBw3z z7kW(ME=pu>(;r{Bj@%Ua?H)50f?qL1e5t^x+pzZq!dZGC=e-)~XGkXTT@6})ro8{ECm3&x2%G-|4z#a|@T8w{;hSa(nx`i&tK04fxHQpXF05jz?_k zq4=O;EU|+-!#sioiKpy+_8Fg=QLr@BE&(^Z_n_BG+eO@JKanCK*8=yY&ho}rZO`v0 zXDxXdb~P~Kxt{f^o;fd?&%kiD&xJ25e;zPZnXBCQp4j`LOxH7q?(HvDOH@ne?&!Lu zy9Km}YAymiA=RL5eZ<|S{T1oaxMELodv(R63h< z_Niw|;XG-=UtA^qlMS3&blJ2JE!{q?dq)!`H&-u(6upm2Q}?zl!VIJ#?yz2Y`Q8wn z&5YZCW)3NnPyIiiH^}8STGB~AH3g-|K@f;ppTKAhINzkcU=hJXh(co;bB4NkD zZ{a6LTz22b83{pasRw1iQGvIxi^!R+AVYh$fR2u7$7$PHnRk;-|AR*BM^9-!9l!qp zbDaIUYuy%fX;qnebG7c*3c!4KlLkOeK^8FhTBO@HcqDLVN*foR$W! z&h+Uy@5T@oy7*Y0`8(*>bMKiF-6dj2%&!5wTBak>uuC0?IpuFYT54hdtQ^lX60C1I z`*uM67;;1Yb^B_TWlZxbbn9A8z}LxB`kg^KTBP3#L?CxDC+9eBHTG`Hh&R~{{Oy^v zd$(J;Nnwsl@h(T=kZHGRzsl#EK6N+SAh7rHkGK@PjOtUMh!wKVzRDk}QO&alavGp) zl{P-af8>;?L{%o*s>MGboe4l@+wa(>dczhl#nW2+240kId?mSNAy;atz1%!QaX7?z zhDcPqdf(VL;_NQmoOo4}c4OnNpzgj2SHRaQ_&dIreHAoH&iq}jyv)NI*KYM0DI(tY!4`FmQ) zCz0*R9clR0VjtN_K6DHgv?Tx}YGz_hcbvXkMKo|BTT^>~ne|b9*tWwf2d}~SyMhk! zvPYv2QRc7e8qA5*x%wnZI`ngUPhU`TPRBVH zlVuApwzkFVp#p0mbh)t<3O{?E{P2LfY&w>2>*rP-!o){E|MVEV=qwjD8Yg7=?(~fH zTlY{Q);N7;`vZC=@ZyKBzY0n zC~7g=f3Dmi){aZ|l-&hG1P_N3o3H3vI6L?Oj7=<!1W5E-w>v4}lmiwdu zpu3{pU4D5Dx$+K4lJ8Qa8((P6IkjJfo)0<`A*vd1-m5t?;(YmQt)GOmxn4HodgiUa zLIEI|A;MfZbsxGT2=1;V*|@2%TvolB8fld|*tFzSHqo8_Tgfocrt`@BJcyCyF37s+ z(AcWrR@d$G{4?@ zEERN0Zh!pq>Qk+1THogunzvMVWTe%74V`z@#)b}8!)pGrw~)(x30mVv)MXz89Vy9u z`X9=bP6eSQlF|b6hWhnS3lrg)#zDavn%`Ad!`|%(gGcPr9o5j;^Saa>M}@3Drl38m zF{I{FO1Ht@#^z|+P^dsC7(L!#P51IaPQ#m5Vz~C24aln(num<63 ze0JkUv=kz*9>)%To6{xD)eCUE#Pme&%KPXC^}++yjA^KWFWwrn-`cQ4jM|9=;NyXx zi5<>`s@Ijh{L=uW7tTWvv`M@>goTcNiq&L_BIIM^;)~{UDNPjcN$H&oUca-U9C-k? zavlT+2Dv1^!MM#LsHm$CY4onKl6H@smhqa7l$RVlxG%NA>Hv&+PP6PPpG7u(%I3I> zv&SU|U^^CMA8mIsQ{R>N7CgWbnV$ZDVrs56qYVlqiGK^G;}Uj-oNOMq4yKmWy>rJY z*t8C(@bXCnwm1A)T$W@nK2vR*vy{x?n4r(GYF6BqJ`cv6{z4e+vFWZBm>V!ua0wn< zPA#^Jrfl?xj$7z6TEsHpbf^gq?k^ja)vPhUy4l1-t~8k5G&KbEWQFkutniJHl~v6L z`CfWm+ZmJ4BHFhP@K-4C@cFdVoJ>&oS5D&FrY0v}5~p}CsL+wD3TT;6@#=&jO=6AI z?K$mVijAG-}5pv%FAwV_b2aUjv%Fp-}vR zv}&#D^s-4U4D7;z*2P~z1+u~IL4bYiTjL0qOpxRWDcY+=+?IWpE_IuH*o*z&gPEG; z86}gHFJ9TI@vn7v%n1MmuP|Pv7CGkUzZPspPTfcClup-GJ)@C=u%;vOTd3*5Gd*JC z_cOlshu+OZCsSb=xO_)$>Hgb2rU%&WIRsm;F>kb2ueSitZhoxjwJ5LMCpl(L&_*|6 z0I<@PZEJ6PZ>^>-1%5g6sZ30?h3FmpidY=m*QGScVssXqU+?S@XT=EzuSL%%X1W>i zOFzg(&gb>oU#bQa!&SSUakM^nzLizoG(p2;`^L7Y{5bzoh*lNADvy5Ajc&6= z=gs96l(f3&wcX{_WK)f@zJZ2TwnnOR<~IJTjZP6SZlHY}Q2*^6y1UV!hxu)@r-S(R zORIdYJ8D?BGP39;zd8kV-W70pIcHS>_)-ycd(=fKV>VYaqj|%@iT#&J>!q`%Qq4M7 zZO`Vkh_!R=Tf5yW{HdhLGR2><#R8{6!@X3JL?{^5Xmrn-;jZB*(_~hIE)}8I6V$@` zvAxPu=czk_@5*Rp)~eK!0uae`4|7`F6O}|;$(%3ZYGOn!9yz-H8w?6F9sev$T8G<( zvX-5))O>Z1uCJ)WQ_vkx1h^a&qIC*h7n*Iz;0NBIYr>gn z;U`Hu@EK&xS#?5C-1C(gI*l{OO&nb&n$>t#+f}WZHSFLQJRENswLTXZ?#4JBR2mf* zDz%UULdRdzYm|}N!!n2|6GF?YTminP;afVUT_u8guZs$1o*!LKV;lyXF(cK=!Xhv| zJ{LPcd;qXo$@VHeQCFC5*eM2CKwkA?t2aAcid32uI73mLsmmQKUx9|mcGHd*^z~=m z4WCgK$~w#Gznt9;OmWNPjZ=KBGk4gEQ!w|~D=&Oas>2S0yfyoG6i;dy3p3}#=ix2H zmMYs?)hzDb3vaU9}x7+K(NxZCx~pj;JWa5^|Vpo_EnUh1j;u zaew!N_-#A&5M5lM{=e9J%djZF?_XFEL_tC&q(KR3rE3U58iwwY9#V2-D6tTvQ@XpP z8x#;2hLX+!X&6Fc=r}j%_xn4)dUMX3=X%cn4Hq+W@4fb3d#%rkz4pE-#bDjl6GF1R z&8VlkPoPyq51Nw>t6nNuEQdzW{p3^8*DY$|z#Gr+&_9ed%%1vXTkG{xWOqK_#bR%2 ztCJnd7V)q(@7}K9n%S)`qi>z#Wxqn0%I_eeH#IPAoZTZ8rKMcGJn2^!R{CRbR*OfV>8ZK)3RpHsi_< zmy0K{E~=9vc%c_s*_dtxtAG$G3yzricRfL<>(VaurS{_V0dkaiK)E`xtlhnA4K`!~ zEdqOWO4^?J>D?tX(b~@w9zRZ?TlSupI6Ah7R4j4Z49>8V$#?%$l4RwBhZcZ zFMcau+^KJ3W?(e-D)MOJteBX7)ldiidZNB|?$*3l2}IU6mFpPsW$a_1)OFAKtj*3B z`XVW|^oWQQZ;8kbD?s7SMX|{^4~?8dVFL~$?nm+R}N6hA4TH^^M zER1_IDVXSe+r?fSK50g6tj2;i^>;Q3dha0F$YKTb7FWU_4Gc`sX}P)es!HTj^2S(& z)Flaw8{79xJb0Vmt6{RL&Y%^Nb(Q zDcx#%iO~s(JE;9#Da|M?BmWG^q(^Ju9@`Y=iP{L#?-vD~z2(=w3s4Eu4!`T69y<)0 zDV4XH+H8zDERroJD~^;iN;6=}C{FDZZ5}`gty#zPWMTE; zwlcY{dJPqX?ZeF8U60*!M}%b&Qvi(XC>Uxu1<{{&gjyzY^6lTjKT&&~s-mwHfA`A_G^kVLAkrekV1##AI5 zhK#_*kJlp0V38+jRC+AmmwnXRiKOGG69A|SP0oNY%cl{F(~|p9pIv6Klr$~Yt3a@j z{Y==0(~FN)KAvUr0(=L`b9(#WV5aQq>wh32m`Z?fhOe|F3mPGn=Onx89 zd6><|32E{$Z1`P%%ZyS?^7`fa^DppG7}ap#1|ZA_|+eIp|8B!MZoZ5#=*Qt zz{7x1$WxzYjvEBTomtm`D_Hy#vrbS25?yw?Jd-W(be~yR9n{eBr$X)Q zCJ%pd2hLxbBHK4>=gJ^=v6OBcScp<#&AklCeuQiB?3y3u?Y5uXA5rFS)>zaD?)$s& zjIRu-biyXf8bN#I^4wWex?I5RNA&ts;WU`faDZn6P?oZWT5XcF_{-KJWfJ7KGQWuP zW3$ZDn$bK|x9p9SWXUT`FIB~SP{d_&dWTsoeIK#O{#~+baY5BAtKvz#|5h8_1-;)j zj9av?#i2Malh&0D2b5*5>z68O*dtn5q{n^t!U!2MsmL%se7}|1bZxX}s6eN`?SV)%d(p;YN}zpMIEEkCVm@z%%!6FT8k11`njaxX94zV1!t9Af>aAUX!Zi#_ z48PGHBTI_XJJ&Ct`1e1unb-Wfq-QKMeamM@1o?&R&j+`3lYJqg(o(VD)Tw&if;j9oL!SjJX^Yz;#>~AXA@vam$m*bAc zyrq$?W*y~-Y>k;K2m+g7Y z@)O^DAf#2fgy>bKe#ft0T)x}%jGP+`u4+rkzq?#tLh08i@duPzbN~cjB7G=Mzw)Z8 z4}P)~1|~~nE?1}g0gg_&@+-$9K4s{ZsvOl7J9ROGQqI~}&EYghe~r1D_(_#g&|nAYjKP05wDvulQyf1xEkcy++lAXJ_0C^F@JTVeN>S2?D7L(817+IsH>&Ncba1W zvt+y$C%M<~H5rwY{IIcb5t*0^8Rgo-V7yY(0bO96LZciOlD}oN5?G8(_p|VmLma}~ zpc1A$hCK1DsV3nY<(5@!FDaI;1av_1>pJ(0oh~dYM(xtZTuzYX_UB5u?wBmKxK36K zL%?W^YYOiF?(|=cj$h4fpl=F>+YAL?%LW;kG>|PtxRnHmtG?9~Xs4{aYuxfQ<()rW zb$tyZ?=fL9`#lFkmY8UfM}z@@y^@U@W6Z*`R8HXrX3d+uKqdK5ZvghD&q2?-agVg=-kA z?Bc=-5^Bq?;{3aM9PM@+JZWpPS#aR7YzG=g7 zFv2S&9*#2-cga)V{ip%7&s4LE4a6XUuklt72Gv*Jo<@}cSAzVO6gfck=^@|4*ng`& zA>k)j(rDg|8Es(()3}IplhU zeWmxq>Ew+o<%!S-l*f6Lp!SdQL;}iV?!2MC-wQN#XKXu;B3j`$8LKs|w3JEos4TKg z`3N8D2z*HUI+lOSDi)^}6jyz{if9p-*Gc-h192 zS2jeJ!>`yY8)}iVz`|Sm7k+9GuE-~3u%2YT!SaxzRRNX_@ckfkCY4g6qFF|>#p@Yc zh%4z3cfReq$lb_#La&_%$NSCoTbXafwI?VI$C-%PIv-*90qAt&`Dd_)A7~T|dJfY? zWN>_(=%{oY5-z)O*+QJ_5*4#2XgU8#jR{d|lIf5Mxt|Fj<=+_D#F(ZK+qN=Cma#AyOdf!8A~uBK*Me?@cgtGh^zbvt zi4DZn&G$C|t>^;Q1BB}PyLH92ji`RULJ4tFT9rJ7U&$mG#-h84tBq_UqK522RV6Xf z+6Pu*SL>8aJS)^+eolFX&w$`R12prteJeSpD?qdka|=S(FU(qim{(uBwk<0O{`6b8 z+Hl(DxkacU^i@NYc>fSCYWtv9nc+BE3r}6JZfRILOy^j^+3&fes?CKfAphc>Hg;#g22Bc;n zP>}B4mDK?Jtx>=K&7=P)4ImMZo?QYQSY7Vg{lUWZMqF4Qal!CCmr@P#;tEsckC&6Z zj(P9Wj)YH8{x-AMG1Kp+Cfy4rnY1heq*Af?jEA*;c${^AvI)evt;pK*nHe8g%diTJ z?bG!TD?K?}>Gt2^EKd6ZW7|%@jl1aG^_R4m4~aShUkdX{0+UN*5_L;nL3@@5>A`fH z9IB=~S|D|e0$@s>$z+Rd(%kXAOz-|d)#Ol z3W61{FieUSfI7X>%&}y5`MCnR{YmrtDOMpL#fLD^{CzI*8yb6KEawEDztP)_gL;j4 zv6qFNhqs;CI`9vUHtJfWsN&}Vakjh^=YiuTp|DJ#AnOkkfPTX#R4G5X%Mc3IpE*qoU5of+tjy03!Qq@ z4%^s5s7CgkHi`STo=ncvE4l@U`AqmGMxa-b+Y?*`!#@U`^|pHUanG$%pcH*=-`oh6 zmXie%QC|dv?cADKtYNL*2i}sN`!%h$&Dz#(dZ(hXlrgPTXO^Nb;(giSZ&5J|q>et& zz>Fj7a6aGklp+>S?b5ACnTfiRe%ec~0`Pyj$hr@`3{}li zqVCI%J{3bYL$|3cQbx}WG9_`E8=pWAwvfjP&GYQI7_7NZnl}z&Qi{%{XPsxxm6_Q* zdSDF;&DoV2K417=*0-#WucO_5!JX;=`96bzyQyvKH%lh> z&=ihwqc6+Uk5_k-np0FfJg04HWt1OOgK8WMeGp~XRr^kf0`MAx6pn5;5i5_w;DS95 zz`D?u1GeoYRp9m?j?X2rO-I-#Ov9OH<~m@L^ktc)*#0fO0(GH-y5fqI7$ z|0}q^MX&SPy-O~w4U+RN;z#&E8|1Raq4^~w>C(34%uIs4^Up<?WQet1Wcc$O$3XKDHuQk z4u4#Vhrvv%^4a(FK#N_L?3eQ$>TN1-)so}FykpnddXl|zkz-|#*`1{(1~3XyW*a#4 z)>BH<=V+C#RYanTQUUS8EKF@i%MIz;l^5AJxSUi;b&&^7XcVUE#VB9&Lr~U>9lmd3 zTMi;|JU-^yIIGwKRoOK|m#MdW|GEo6Kq-NzNHD9dCK+-mfK-4|9NI*qUiZCW{%tNI zfN(Fcgv2`MkgYrWmPUNumpgt$MAmUg_Y~c#4YM2o-$h==xhWT{wmP#c8SenK)i;_3 zpgP~ukJTwXZyX>fRu1K6xx9V$KGQUN8>B#>_@hi_9*ze$X@%)MFFy374cKgm%^GK1J@Eh=6i+@+!XVpNNd8TjOn&knu~cm`29 zN%tP7_nnyUF#wLXxZZ8Mr!noO0SbLBW-QXV&B|kJ*n6ulw_@(!`%yIgbD)0&*do5` zluO6SAQh%&|2g`sHd#xG^trd$)l_-z&kCjbAOjaV8h8qzftNya8EM_>S58a1_bT~b z?j52R)P6ko4_lf*Z|4j%liDZY`jXgUDTejMDf_93vPOX6Dc#**>&*}xZ?cW6m&san zXe1}_g}Y+mUh?t|Kp^Y|v9i;Z9V3*b1H4dX4c*&aEPh>>5-txgVe+%PUC;}#n0to` zO5R&22I{s|c`!T{=2i`5G%?*n`PL{IyQVjb6o5Tvw(fosJ(tQP7=-WN6fJMt4qYYn z9OP0ibhnJA6s!B%m@DaA-EbD?#5;I74MxE70@US}g)N?6MijE_0PzZSj6NNVXupTu zkHXS1dJE%IogNTetS=!DR7}dwqZmqV#@xsD5{@_VS^$J?ln+sGV$n(@e!({FA$OV|#_ zCB&r7d7(AqeIuuVi^)%_KVoloi(Gm&=|FhmMcm=`)#@A3Z;usDD=z$98@EE;i^NhL zX2n?U#wK~qkLX^fccYzQ#|^8gNhjwEwDM$F)x2%>*-~3FSfml>ISzP306hI}BS<^E z%s==naD9CLqGFGneCML|Xv3v>%x5Bug7Sv{&|<^I>Rda&(aud~T$fOgRa|Y+xAn1} z+M|+>IR|FD6NRBv(4OY%v!KWeJJ675sY_G=X2F7AQqnaQri zDWeCl!^2Ny9QPE z9O`)52y$Mc(Z-dDmOY6~#JF;#G7GP55KSbdxZ`L_hUh37rR5_X9@qN|#! zP{=V$gI=CX34#C;1f<6%1i>D^{Y079?l>Dn<>kC(9oz96a4t+W+0^qT59RW85>ORO z)&)U>?+lthnriIivlib;cZj-6$txFs7c{6ilS2+$ zr~1Y$)(&lm&O)TV%R-dQD-q~>Bto8g4O-b55VZ2nP}IZ!9#xwU6O=20*qQz2$_som{3SK3|5B!=}n za)n)K_d}3eEn4_WtX8r1mJOJ^rQx(!Vpk1h1y@M4?pn?F!1Z z#2Kf;7`7cHSvuP~Lkq^-mzd{vcW=1gYjmcZ8(dab<2d72G-`3SvXPZU<&PGs$8+Vrvz+u;HyFmfpf#6e8Sy!(zj_4<&C% zfnt4I!_0y~Mh94~%KSK#xXmzW?G?8_Dgp7KolgKV!95Txl9lpmo%N>rt#_odqdB?n zIeBfbSmO$~DnPt@<(vW1V+TYn5k=CSU@*?FCrQae%VU3j`5m%eS*puFvp^yU9`G+; z{`C>WA)Z>+QSkcCpCsbnt^PdVC*S)gc>WVsUS*yx|ExFxK`_V&%lz+e{^U#lJbz2W z8UH_bDjteUn7h8sLVM#s4;V;8xcrw+VFo~MB~<%5*+0|zdu%`!;=gp-KMzFSo((vi z|2o4<(FeXG%w3@T&z<^F138NEc}?+~f0Oy`d;R(NTAX3|zjV4+0|f2VB^X?PvHM>p zjL9O1{hvEc?Eumf`>%+@{tNekB^CTHo&L{~{y(>*e0OSsIv4HZJUMsyaE&QW<#jJ^#fZB;WYl$75p&= z@@y~ydA`7eC>2p|L7{~0pS;=bv`ysTd;!yCr|QhSUqP3F083zJ|!qeWsEXwR|B z!!AeWic#?>eb>|$vrh8$z6vxq+b7;jG{=XkT@3@K(VpJX^e?FK=OZC00KiT!=X~T{|nNztT9RB{BD>NhOTIUV_?}lPT+;P)QOw#>NBb|-Tke@STBQG zLwtTd1sV5{y;Wfy=^#M`7LC3ZbFWHXs;G(Slze1~=fbbF)`1^LMpMoxpBw&gIbthU zZVp+w*RqVd+;KnNQuQyi}U*Ze;d?m z@qx>Io;sG*^E-?C%!CEQ+2=#0EzciQ$(Wx^`i5(k6b&A$?tXGv%<}{&65dDmxdr|TbLbJM& zK|701FExVnpYck3;8w-(MpS44euAh%O9DK^eHFBDhnc3ug`t5_F|!h|p%ukQmG|m~ z8$uqH8^(`(Uzz7o$L!f{+*Wfha|D-Ekv|LF4=07c!R?Dl`@SaGSgXZ%He*(nUDlrT zea*^ZzKM*>`y&Zl;Z3afM@6xNhv9dvIzOhp%?dTdiqx!{h__ihi`8tZUODnnWkL0Z zZ-0jmQSsb9?Zo(}fdV_+o}(aUR!NXT3sB4+Fca=*%-8$T z2KL4m$p8{mrJr9mq@8D#mi1$j&0Az-GG07kiFQm#-m(-_@hxQH?kfGACiokVOo?8K zDLjmjS}`LDxHp;Uf6dAhHe@!X@Pa+*;owcqXf&532}j*C7Ws_gB*rII<3~VR$LlPXKy>MN!z)kO+7$ZweJMaF}%n8fIk6LKDVmpXr6X1AZ zBS@^LIba}t76>ejMqb{#x&^)#JeHSHX9uEsZc^xB}X zoP#!W@q_P`yE9<;^~VScKHNFj(cTTunFE#fO2z`&ulpTESktD*O?B%kZ#`Ne|q?f%!V^Y~;KRhQ>m0jmzfq)*Boq~ws>btSsK*3<0?or)v>~Ab-S~9HvO~G{maZdZ$)0tRr;3eM>*}TpvQvmrM?=!7SC$Nc7bs8mzibR{qo`DjB+x& z$zT{jb;93u0lKJ?bqo(N!_KVAM#gr`d6XT-;Bu`fl$ERinKW@P%>9xJM-R*Ib%X)D zi1T9&vU`uD?qZP86iq(zboZi7sZ69dPUL3nqW117Tg8HgsVP*|s^JBw@v1IGS&1)X z+gGz)YXJb7+dm9!1{3N_Fe>5rn*8SY6?E%TM3F1s5C;3`MknNW$R!&1&tJENB z$N{Ev!eUZ~FY|lo%Kd(TyS`NPl)oK)3(rPg7QHaCqgvf$?+TKM?Z>ni`Gh@RTb2#{69&v%^bBa z9&%sSI@0!kQ9U1hkm-saQ@Yz5e(pgcsMQR%fo_DYr%yQuyd+@A6Fo@rS)n^<{b{#r zUWcQxAHc%;4MZVSp>N7PTe-m*>hUIOvxOumk!fDKfaXANNQE9d-+ZgdtJELzoX^2q zTB{*v=9@{Zi({i?JJBvy_r=gEtGYuCI7Ds?X7SGgM6iP6?C)N3@@5 z4isWBKS$5z`8-cP8Q14Rjrd#ORQn#7^E%mKs;QZ5ebAhvO5pdcVmm+QRg37|Fdpvu zaV%=XPpzQr4!munG6|^ADQ|}_X;)iwKkTwod)^oNXr)(?|9rB_5IH%A>JfwecaUPZHc@)oDlz$vu=^A0+G)doVMm>Gd)UdOVQP!dP!BTg3 zp`2@{spPgX!|CVG64(5cG2=ri_Z^-d&%Ixz%5;q$>hCVK@I+AewDs#&!#Au(6f%y# z<)+r;;(qJ34vC?kB=-!Sutbdiz+~3ETh&}4b@pV%BhM+Cl<~<*HVt1Ea>Hz4K*6#z zVi9F9es1^uULLt`EWPEs>;62H&b}Ph)ytuRZ)2XzCkdOAT*p*1PHi3K<7QQK=@HUB zIuy#QTez+(Am}7!8n^h~;ugL9*Zw!)Av!^PjN3#i5?#b%XMXFyL@`rUdh5@O$TUBH z6>0ma;{73!S=(#N{U~G2>F4ndv_XDNgETGu&I3kve6PzIR}Mcd-Z$^|uRSfwNi+<^ z6{^P@r9+>Hx&%vp9x+$Hd*@vX zv%TTzLnMp8C=@M7@<}}yT#&RswK*M(q`$0dI>fzmwnJdPO=?ixSF5F?`7XQGr+Iy1 z?}Odg90k5z#}2mn;4foDo0?=shZyq`p)3X9?L*X~iRfj;>!V~wE_Dxo7aaYr;9 zYk~!72YH5AsPrRw4RkNg)-R0l`QqReT+PWQ-m<+PS;*O3-4EpmlFng%zyXPaFeX8BJ1FhkQZYF7!C!L#{FJ=u82ZfqXq(UqLryNmEzuB~c- zopJBX1r8&fQIoKl;lo_Z3*QEm;eBt5rA1QsQiri?57lJFvwYH!@UpKv$6G|Pf=zeY z-iJ#8PK+PNZ5@}uAp*1WdJtzw6E`8%#PZ+A`8!(#&x22I-4FEQW|#FSx!6GNHhY$k zcZ$WA=!3$xUNX3PG1l8A+TeaF7=2sdFN4wa^&R3K3P@?jVQCPQdh^b0KFGak(I>=K z>6Y9_2nlOU*(A|-yg-^htj#}|r-c#-3_tr7vh|t9)T@JSW@E_jY`Rc48JQ46&MW;Z zi7sso>G|wD8`jOvLq^(H>f3m_8J;s`ruact0)@4NI(cB4@rr#U`OTD^9=j&%Vl|jU zT^~z~S%0R|WBF6r9`bG3;bzGZ7VG?rY??>$2UU#2kw11T4hjnm1a|_?2`Pz7MEBy> zXHr(@vJIjo0*z zonv*e82LW&55gl&tnBwOQd|vKIYB$v(Y~O*hr}+9QIPw}(V|ss5MgI=(aBPYk%m%Z ztQTm5F^iZrL9uVq#+6?@3PcLp_uLG9?IIT=^f|-5=Diyx9M<6N=dIS(kW&Lj51-(2 zz0j`7&}plcq!Jp$g5gQ{I(&H;2b{diggCY32v_$f3CK8dIXX>WE+7O;h6~EYM(L`(EKK^{ik>7y!x!#SAG(#w0TCP{W zs-j}j_Sq6zotY#Q&_JK<7trLQH;<`#&^M2E63a8cq6PNwA-19q{cXge>*llWBF~Z9 z$|*eZRZWXc!;Z`C1mB;+^fW+vpty}4{gyZ9hP`ycm-&S_29us%H1XJQ>UIy;d+|D) zR|)&8dg5KfntobGvlrCScxxRAB4DpFi)P25I~#dX3N#m;!@sI3s^vZ5Y_-Svx=Y^> zUpe2iD9|_*X#ur{#=UhhyILLx0rlPly{Z8^nRDd}&7{KO8`wp6W?N1XT2mCkp}W+GrEO30m}U^v=(0JfCkL;M#_%($M+$fSGxB zU$$7`G}UD*tfY5P>_DdTh=1y_ute)h@!lx#X)%-pHxP-68SM05{?+b}?On7}m%9iAdXNwgIssVHK ztx9p1ZX3-@EIV@Uc)R;{$5zu)ougiIVRoY|dxGkT$VC40v{q~u)*u4PPBC?khJ6E% zImm%}CrWgJ!Jb8B^|-XMR!?*v6H!Tr*;F=mKXb_0ls#f~^ekun=$m)3kX!!!R3$9t zT?1iQ*#t}@WChJ0xriWD<`!A#W$`#-;LcY>Rd!-|) zR{88t%tLc>Di>lDI@83Jpq6x3j`;x&Wq7FA&h(-Rk50Y*ds2*5&M<=+(}5Y`_wp-Y zk~EI7(&+DnPo;_}3Wj0chJ)7HW)ovRquK$DipuOHk2pXT9~=+aM6sT$liVMFEG}*!*OzuMzzn$hwT+Y8Gj}8%}>5?Tt=kz zEj8ExCnZa(bE4X?VUo)RY^_EoU+?!%J*3&Pk5-GMe)A*YeXp*SZP(KISKhE@zSqq<_5&66 zadk-^Z*BQcR=ztgYD))5COtl$WyVKK8Yyqh=1B4nZ=tDeRv*$w* z$3<{#mNLbS^h(`zGe$CuqPv!#d#+Lvb#ke?RcAAA%XHl+otts8>|Xt<)HVjHc30_V zN899c-l)cmVGZ5Te6%JpClpafEaF<-EZo_12`YG9#%;OP9HxU={4G7RB$m z9T(~KBvB)hN!OYs9_|)3UHj1WL96Zbo7z*KVntzSOcbV1I1atZWo_Hb+d5g|c z=onLC*SrBA9yK#|5~V&`#imwYm1tb3)EnB&j)=A zd5;wL!A;MRp-$1usyXkExt=OADpIm}@(tJFycCfl_?FvaI{Rf}Sp58htwKtgWJ8|C z0S*20e18Z%X94-VhVSCO>bH`|#uGYm^;P!aefv~BL+Mch}krzJ@P%4=ZuG%(xjv7?!N3bWeDGO3nZ^nS0am69+$=y2s2Ok!87&#DzewUcoavYG`n)yF^~gZ(>x z+wy|6R0)c;t54(ZeW^f{-$qm)hkThes@<5h|UHFk{JQzRE$mwl7&tPr}iNi5ABtw1)Yvf!qIDANX9u3$*+uxj}8>Fh8#5K&GNUIE`ABmBt2qKH~&oc z8KvCKGG9`!j(@tNJZ@8Co9T{VO+SN_NZ1s1d*Ci(iWN;IiT`RAwBRyu%PZW?wDNJs z+#>0@XPdk%q5UB#ad->PbYhkJlSu8SSOVR=;-#r$X72|sfGCcUcOx~k`0O0j*C@&H z^n{M1TeR>QZ8TP0##v++^+KaC=7i1S^s>(eMYTdZJZex9&9fSE$MtE?yX8q1LHBx8 z$tOX}%ax=BVQQeHni;gGBgv;C+2s`CihRNbpBc@qGmSg}t=fGM|FO-1jS)%oEwZSP z@cP)S0Y9R?xp9z}u?m`0q$022uTVuItIgDs*2Rt#=4zPytaLcnY-y_$Gj1`}y;^pD z1f53NXu-J;iX-gMFH_vzSSz-9QTeq?)h7Db@CM;?+Ig0lXy2x@cnz%+Y<*jP5UcOh zUb4ZfQNwW1P)U)VC^sf3e@>gP0SK1a$8dvzGRys904cKe+T4RnRS_rt_fYJ}MRQ41-G z5c(MHT&}i=Y^Rw-IxfX&J!8~uE{K^>e6ya#g;nKJftpudM(aU;-CIwBfEWEg!We7| z^j6n?>dc2>J@nL`=Im=E{<$#&dlueMkmFtgb4r>R@UHf6`eYn7z$f2Z ze@?;WBU^L7lO-#|3VyWa=rehD{N#u9c*XJaynLr>-wN7UW8<;M#G}ds1b3IF`=wFB z(l>9S=kAo-wiOH!WC#MhnhUqFPQD1MqXBG!Rw3o7|2m{eoTYB@^IfYDJRp1Rcjw+0 zMB-#h7{unmXFhaJB~`_eWC*!%4Y&!^-ETuCC8f%(_O+k9t8>T7Jgu7JsMsr_B=nJ+ zL7BfH18_?L$${`Sf-@9VGi}zsRF8{eohD-pTFK@>qo?}AMAeqkQELWg{!?~u^rYP} zuA!Rt^*EqH%$!igu(shv=ZJf&Bvd5MWj&@@v|O#{5Zhxe!i{*3q8KC6t+=n`=F!RV zG?xwX<4WXa;hi5j58MeHxA+x;PhDE6$#^@=8>G;)sY=OAI=1tUArIoGM%%t%;p@bS zy~@>_+f;pJ(n0N%J2}+i%I3CVAGAEt;m!J3HqU;@ONs_MQK>L>4jHdRQl+XhlPI3W zunE=c*tledaGu6|8MEvKIm$rVgZ2bYswpV#n+&dy}{1?PucT@AIB4no+Ni}s5!)Jl!!2vyrLE%!e~N$ zs$@dHGTI1U`^n|q7o~b%@eSfwTD9qbhG?UfQSIa>;U(&FW@5{LF2Qm30BSBBEjXTAWd+G zW}oO2uOsJ^0v}axnH;H9f#F`#oloKuI16`T!`}`Ubrv+(GOfx-Cm%vJ zM!BGbtP0T@zB}daxLcl_B~fSj)mHvE9d5ZDZNXwz@kFoo+2fo`@91y)c`8~C7wn*A z93l<5IU}ADw?4<;ioh!Yl_Xnkx+HjSyY5~q_(m7aSoA%^{9O;TuwEsXLpXbVh%Dqe z5lFfqB{~btk07;5X6)E^h*WZHU~?<3sFV3-gT`V>U`>ghxtP`M^INw`l;;((R4#^X zF`fAb#RPJ8M?GCU2a7ot7%?~dc*PM#DaAwr=b(;BNj^4$X-eTv7Z{0pL1O`B3rQ4`PT~g&@PF@t1EsaV^3f3&W6dl@TgkrQuK7IDqUyZ=K7&i= zbvjTQEO33R2yXLezT!xfkL)B1tIRUsWc7PGh9gDHMZ2Rqd-r@JXv$H^oV#7*L5`v4 za!?ejgC1L-NYl{C!s1`o0JTZFJ84YnE_Qz+MF4l)!VdDLD-_ZFyS@1V&mh*Ce)8bH z_NuoD7H9eeK@^8dTON*aI8tjR&&YT*u~^VX;Uh1~er1<*MTUx@oFFmzm3{eQ-k!!` z&g;VjT~f`+m}9=5Gr`L3tG_%MZ0rMqQoPF6bx_n`XH+26T#Jdo3eGAf1LQa!>VsON zc(j@xBUsU=#|?W75?eTF1*G?WSM6m5AMw}+H5lE^Q#fps+e=i`Kn$Ya) z{Bhq(_Gkre(;4r?W&P!%Xfikk1UpYAaQnc6gt+uFyj6Wqg;?6iyztr8FEgR}xDt)IpliJPhB)SGW z#Xx`(Z4AE~6e-(?=c_@JM~b`mUoggDs-4sgu%J&+!#CW@=yRZ8P{2T1dxo7WXs9Fq zjk+LT0?fH|IT>|}bs{af(`)ZDIb#MiMnL0rJ}X4()#C%pHQHdAkX$AY_m8{^cu_Oe zvO9GbtB+MJN`?7~wZN-JOWyJa=Cw;qGeNW}IqkX*wlNtpA#w?UiI8PoKNt{@H^wja zoH&N}Bqt|g-EU?vZeH)6ZLMuLI}6uXFAz9K#ug?S{r@wT-F$Mf}>A~$+f z4L`cSOVnzgjBs&lAujm&>hJyWPQ~j9MA7(bKhq1S)83b& zpAIH>8l+;s*gM!{i-zqeOS~{`QJU5bvL56}fHrD0oZRTsiKZ|=+O>lBXe+JpklBV9 z;sn-n3qZP``I{5xQMW5?G6jN@9q(lh@%520O3Hf{h-cL^S-2O=4eEND+BWT5DT?ht zWTs(9pZH~&xqz$A?h$1U?N~<+{Is!4U1Qd72IRl(3?2j0fLE%-CG%Rp znLDSLnfcO@yws$yYkm?tStwGE(7}eq+q$J`Bf=?^_luleo45Ej31-G0vxj_5tdvI| zU&M?;kE>XzbqH%z?RG;zI|Guwze36(+92WO=eyU^$3iwICVwf?9W6(O!mGTKri*F( z-$r2mMThX&*9EJeg!*L<{!#qncMH?GYY7qUQtjbrg)BW)){Q<%T^&ojOFxR2Km-qq z)C9xjp@e1b8~1ng(XsrmqKFO<;UTTqS;g7y6ymNHCJUxn0-)mdFr_AWrkX!$M(8;?a1z4K}n9YO@0gOhcFrn?zYR? z?Mq&mS6lX zqW2)Dx%0Hck$FdlT6u|d2p?aqr>Z5e{b=&~4yCAk7q}qop{FZ>LtrjrVe3LfeG@Bd z@(hdB*<|`hY5^kEI>WKYC3Z0e2eU+gX#aeCvPt*%}x~n!V2N z!!Va3`@7kn|8Czi3F;#3&*FBdey8)@^v~%3u2>=bsP=kmT=h+QEhe;WUTb^jk`n7G!>n7FHZGAIF^fa0Plc^fX!l(*qK~@2t;@a!we3UXh2a5wn*HiSpxZ4qVXBFeTpxb-wjI`_j2^yV~<6 z+sw}D#|s*E9r$r*dm0GLXFS%a>pP?7r!nY}RVW!Aj7lk*zu_p#Zzjr&=G@vhs3 z__De6Tt__XZg*cN4EP&6&wV`)?mx7kYQKJ}>+Ze}&Z}6De{Wf+BR6DpFRel$4J(3l zoc3cXK9JuluU5uc{GsrSmg?T#LKbacSgMFcn2HWZ_+uN>wa(&42}8g=(l)!rC%q>L z9%4pb%Skh*K7G3$$|r8d{@1Q!U^?F=)L3eF0N@PK!UgS?}`A&v~!ZfVx0x8-Us?IXJXF2W(Y`2wf16kf}DD7k~T9 zf^U<0Kc0HFwfFn`Izy53`^*GueY>yaR4a$Y|KG0{{j)efeS1-pDcl?u4xMQZ=aX_% z1#5#g?;=ffCfYf0>&3 zdyYMDy8TAB>*2(Ot#wxKUcOuy+J)IDu0 zst!;Tv2Z*AIi>aLGHh}w!01oAxM><#A*vS}V_39yzJa9-1;NIsIloekvc6Vb(PlQ> zRHW0^UM0NJR}$IO9hwR&_GCWn0-IJc-{EbA%#GdFS-x|7d;E`Vd#iu6VC&0e-iYMG z!Xcvb;Ntrx_6HSU!3n^2kWlS*nSyV}|86Y5esD+0=~{i{&<$A9uwau%ZMrZh`8Dog zUG@6WTK?}xs;$e8T{|nC-!@I0|LFJqrvK-q-fO)vAK6po;sPP}?jGL_cJ6}5tW~T3 z8tzCjxwiL1TF(7F>n@)ExOj4Jwm7nHG@={=BEPWA@dpRvEsYI-I+x$7n6(&|_(5tf z>;gKdR9hSDNQdLxA@0|YcpNWZh#a-M0v!Tw_6A=S1`F<3?C`hmeMK{}<6OBow7Rd9 zn}HQ*1T6@9^6;D*QVKW_!|3=lhJQWSW`|6ctmk@DmxcEVK{6r89TWBefdfT@&yCMhW31?tVX-MRRZa+(B~Rf?B3J zmCX5DCqt}ZVyZuWeg2!y&6}s%YH+hGz-k~Nsj(Uu6Kf`4 zHwU?PO7H?;8#-=I?%#)i5Px0fCUR z!y;di;u03`3l6igOqI2Bc#32fOxX)IU`{vp3FHTxvmmr_WmQaW>Dp4{AkA0|^l$Ht zJ|(awSMHb}Up-=G=sG1teldY2Sx5+O2C9oZ4DtPoq(<(^_m3Vt&u?xO^Yetq<6ErA zuI>_BArjm08It1~WmuQh_cQOd>#|>#U0Ay6=bVo>4D4>zK#hV%8JDO)h}fz31(5u^ z+2L={oLv>ROLDBz)Q&xR`u%>V=w4s*SfrHdupj~Gxr59Fz!oUbKPN&L)Vt=~*rIyQ zHJ*n@ulMO{xqf%~Xwl}Ka#_Vlq0Es2%)n{ppE K=d#Wzp$P!u5WNBb diff --git a/1-js/9-prototypes/3-native-prototypes/native-prototypes-object.png b/1-js/9-prototypes/3-native-prototypes/native-prototypes-object.png deleted file mode 100644 index 125f68e2123425985b9ba537384db34411152051..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14070 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 diff --git a/1-js/9-prototypes/3-native-prototypes/native-prototypes-object@2x.png b/1-js/9-prototypes/3-native-prototypes/native-prototypes-object@2x.png deleted file mode 100644 index 77cdf9c59fa76bb03a6f174054f2f71ca9195645..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 31376 zcmeGEQ*dS77YB+a={OzRwylnBCmq|it&Wq9ZL?$Bwr$%yJKz7DI*;e!)~UL6>prA* z&As*-nq!SQ@LLI!mlcDB#)1X{0)mwg7ghuU0*(dz%|e0$zUigUEC+l5J1U9^0#!}o zoB#pw14#%AD7yilXF_->Eqr$SHc6zhZNO;cpg^NgD2Dhkfg#2YDJsYd*nJ3yU|I-( z;ctU0qlhGskGh@4Kgq|zGSLW$fKqC>94eKt=Dza6^}D zPH;3V9nH10j0m@Z*MaA1J?Q`{oMHtcHbPVRSw^uC-RKg`MdAmV1_F#iAd{P5ef#`g zk%(O=dZ**1rg%d7J4R{1*Qb2IIR5hrn1!UiNJtjLYOi8CbUPXqMI9c?k5}&6&P$G5jz!Qi$&l4u zTrw}aDO$Jt?;35)_Uc1ha8KkRpM0GTftsMGi;pEjAmTt!Zn8jNe~x}`!0X42oNehw zc1SGYhKQV)de!ZXU6{9Zw%tGdLt(6lI02F}-GU91Lj`llghLNQL+YZcioMK(M!WzW zP~!eXuG9aZPcC_k{=na2zwd_gv1Y$h15++BL}5Az_)T>q|*()9ABuDDjO8) zB~YTbQhX{{PC?@1jT+8E%`Jd@c%eHv?kw&9t$Zv$D{`!DQyC}H&q-7e@Dxspg1vS4 zMmryETU@i79f;Kq*T(u|TB?p*qTxItQ~)RO92ck@pi=EkID?6<}2d^nR| z|BmHt_^&MvQ>e@BoRewq0{%xo3Yi~RaqkaxL^n{FqwTZ3(D2Hyk-mnLT7Ppn()7=s z`Df8@`^=*QcK)=P1SGMLyamnox~--_V&rr^SQoU|MB~S^#D#nmXeyif*MBR2PTRr)W;}G)B$s#>`+jRjJR~r zoBjz!;BP_d2U4J6zbL4;->9W(7G2cU>-u#hOj`h&|E*pavYxd9^3b$jtsERu64b~- zV3CZEgW8CM6Y|sOxhEZ1T1BmK6WiF6u(Rl8^bi6$u`SfgA}M>n8;;SaVQm8t#laMfnzp6aD+& zo+sI0ZC#i(uf&=cw@Cp%9KGJa&5UC+Gj*RGK82GL_RfUCk|eXwNlH!0J|;d<2HJox z2{BUNFK2t9l#yldZU-LpI~|)_s83?nJF%iK5zX3^5_CqMPQX5xX@TN2Fh@}*KhU!O zHK*WfSVCRdf6;in5qopq~B@%5dubO z)iEM!%SMv-r$FVD|Kx%;Tc?y*;9}3Ze+w#ZCqPs@=N|$ApKp|$5SboV9f_ZuZ<6c~ zta`smJeETe!v$dH34p)d`umyqe|Ir21#;ht)m~eqg9b|m4aH&w;+AUAN7p5(l>M^Y zjdx$I7<&AlG}~mr?UNfadax5MilsP&1ut$wQrt!807rb40TLs4X!H6dn<<#vz9veYD0>pkGL2+h5SImao;C6baXT||O${Ub%f7As5J_`5!2ns#3;yT;a9dirh z%FpoWXwM-UJOgxQq5O`a_V&~XsJrut${T;`BGmyQCG4(Ina@J9ndBXCl|u3PDS<$mBA z_oQYL^O;3|Z&EBkOW|nAAM8pL(z}<`YZV-Ib4LnU- znhikDSr`aR9M`|P)JzG#wUX16$=MNww;|sKXC?nXcHJs~8?{Im_}5>+USP@9k~uy< z;0=b_%n4q4jEI0q_|ICp6{<6~ z+5eI(WdU;f&!vF)foK0%2pq=ud3pe&E2t-xV4pTJxthg%t77+UC}u9$@yWHZW4pI1 zYt?mo%QN(c|GZEVATn_oM26bI89q(hWwWu*^?%_k_B%`!&iE~yFF|NefP54Rz9$N* zndfo?EV>Vw0~D7(3pCNMi|@pG@k||D^;ggpK#qgJ52PPBCB#H4Q5UBoJUe6%Y%T&2 z$tMs2k=D`5lGW&>8om|FUgf>v0>u&%tcouSW`SP0!@~32OdBHR;z?4h?ZHM{I z%|tt)qsG=;t?v%Qbk}O+0s8RI5dnfEVnP%8(d(o3+PTN>5*y9@_wim25X*e~;A5pS zr%XO2M41(Po*p*8>~jVmKu{(b5QV{Y9>0zmo4e49ud6NCN_4SARX+0h02-yy0bB&O z{rn?gl&addrb0~&gNDZIo2b(_(PQHY{~-|2GUCXPNyIsT5Poal9u`&c>9*~wJ`K9T zBZ~<2!?$qSFdPFAXdD0+S+}$1 zd{z~o7!1NB^4y@;rZSeHj+H|Wj)Rc#S_Qe(uKKBC{-v~aB4pL7|W$8e&`YP-SKjEP`h-)CF!Fx8x`VY7r!(GI4I=_#_Eh)&kB{Qg!L@j~* z2^^CO350IeSTcq2DDwD-$Mghx&<>d*?{I>gqqX-|SZ$@{c4t>UZ3TsL6RKwWGrcXL z9;ou$eFtl%)b?<>c3iRtc)i`m%52wiMt1f^xsekjjl}GzX4?-=&aXVo)Nrnpn&yv& zF|}4tWTC=ZE%s&@S1o2I?~r3rc^s}fvYhnCv>1gEOj)A}*jMZ1mAvVk zB?&sDddg^60mz$iGJFr_Ty>m!jiO`>_*`LM)HeP}xzQ)gOZEOU35x7`NT+yd~MiNpx7FOcdZ9>+)zL1uXzdxbW z`RYG5w;#$Qj^8JCMUhyqp{^5^#I|ZX97_9r&L#i#?p_wPn4G75kKB^>aeV9h&iUl$ zK<%K*i=Ygj7o_+{5>tLC_tqwsOCAJ4G|15^%5YyF;)c1zMSOPXsefYRXI$s_K*OHe z@O5(SD`|eg=yDy295yoQ3&(#zoP#$RWevLcwFXn1t=-9yo?@ z;Iz0Q@x6+GH~<(*MMI~tQh*Si))qjJ4QwLMKg8!XeR3KXmQiGH^?I=kxl&^Cwo|i* z*G%ehj^oT%X&3UaqZUtO zXL96{q8w6}WIltQMruV|sOG~zyY#6z9Q^z$5%7Jvp~QUyy?>_&l^&tw(|Mg|$z&j+ zVt;|a*JgT8<-K$9B?<|JCXp8cJcjcKzkfEmKsrIq(c?XwUW$A*1r0WZf2Mzqp4%e_ zyigLOCR7o!!}8g0BQ(T%&dWQvFG9SnPJZ~URuz9OPNq9f^)eu5k|_$@-1zTI-w|{z zD%vx?h%Nq+i&}!UZxp{Bnaat8c5BUL5u(kVXUHBr?|FX# zUUwX}+38W!!i}IjK(;y;D3{^7Q~`t|SS8<$@j8tJ0Xs)mCOFg@2X)5!h@oz)PR2WR z^-%_UFBShhqJfnjK3Z#NTsc|hoipmiv#I_kq9_nm6-U=gefFR08gCBdrGrKNaVNQu z6Op1M&ofw50f)mzlR-z{uCZ~GdkWM(Q?u7x~HQ*)yNEO5R) zTjo2+wNf7{_8OI$OvWHXWBLm5$<+pM{hVnWr7EE!^_}7Eqk%&t<_bPRQY2L zBR`2eJLv2QNZ@q>c8-R}?(E|4d=?$U9d1wT$P6hZ<;mV07pJ(scZ8OkI^rDxt!IjA z=Hx0!wL`Qm@tiV%n<*#ayp}hC8qjCNlwI~4KQ>55oKWM)!AD8*qSD0a%EsradbHRf zWilsHddr3br-~8eElS4uIu<12v5Mz}d>{Mz-56dM$kSQkuk;ZOwviU(N}jjTi|St4 z&AD1;GwS87K3^j=CbN|N&!|cfS0dg2Vq|R@T37`2FGt*6#W@*|c^PR+12U%Jr%|Ca zBVo7i*8HgzEtQG=(+KoR(^(O@Lc%~TV*My7l(_2phw9J!(8+`DH0?@NAvWWEU(31v zULQ^~VkT+JS}fPPl{7Pl2Y)?A)2{^`8vp4ne8c#fO3i%M=~qdBZY#Xs-YU9p^X(6F zfkO#zrrWitvQ~TVWX(Lm&^vSboDB0^36O`u-%y=AL}{z^oG11_CGd+lUJyX+D?tYN zT3x=JzI^hajkd*hFBoReJ0HrH^EPUAQvG$z&brAEdESo7-sF)n?7}lBcp8Rp&QW~F zLhtpuThbOnTJKRylP7a2CpN`fw)T)o@yp;{vJ*;nIhh>YG?h$`8Zti^RU*7@tIKC= zcT=0o$D2!T?Of7DK{x+VBgWj;2DzHV-EcK8`)~^D$Kf66KImuh1&k~02`@2W?!}`n z)0k!^r?Y*aVzp)8ZrZ)sVqg50K9?83hJb9a;BeVsm{pn|ew59(2;E!aQ(XFJ1(T0= zu~XrIIZck6z)`jDb-IaL!prf{QWI@F`(8#*Vn=9RH@ByJt!OW`D_%;tA^=J`DJ$do zkXHfdw>r{9ROy!&M}U@8@A%Xfg{~X#3BAIze5$DiXnbKlWLIg}1l1yan@twebwIrO zY9e{v=V4&1Pk)^UCUUc^DJ6neEPoVoH)REuSR~>+nLh%)&Doq%Z#ry7lhPwe6*eayA#YJ-n4G=;>BySg2%wTfDuDv&U0F?o#OkY% z0*QKL+a#UhMNUf;tv)4qQp4naU2pop>41lZqXG9ISFvU~+MCe0nAkE-ESysz^+5uM zKsWIadP6lPfrrLupBAqoFLhd-aPkSpisZ5-crp=)5NWl@EGw7!gP|5kMu7Xlb{wg< zn~nz@U)>masL>2xwg?P)<3UmnsxNRk^7^MJJE&o}(8~_j1c~q5hc>xAhnPhE;`=yV zjWh83&UO8Z1OQcyOnyc=X)--2c_^qa<5y9D<5yGrh_VcW4CsmdS|zS>633~lozsY+ zx6X1?BU6)^Eg?VJdlwwdi0_|06dR_aZX+uADuOO+#f93z+u8&nL)Ba$^YKE>3HPz7 zXKspwpphT}m4NE9EfCuJojvB1{&ES9O#iQ_sIr25%IBFxl$f6+YNjny8FW2%?}eI| zZ>;gCW95{7Hofk`z_URxTN@R=r+3>6tcYue;8Y#!ojLL_I>6!3+9|72-YXk!4I$87 z{+WsCrCpOvPcIq|XEJ$ZK+a2Z=9eK03G1$BtLBkRZ<4x+iU%(4_EgtY(<;xZr4^(H z3kh!Q1MRzX6`~raQO@Y9#I$tdXh>$UpmvBI0%+J|Sl{)j{L}ZD>5Zue{a>95`}aF( zR<}wq1LVlD{2Sky;ghi+<$v`Ti#Q;i#WMP*pZ8y%$5{?gNo*to7yVaSP7{2WZm|O) zVgKu)@Bs2_XI=0VkpBn;k^mm3|3B0JFEH=_``w6duiApNTS(0Ti^$eON%Hkh+Em8- zWqaw&S2cjIA=l@7))uoTEzvevCeHs4_;ul_tJAZ!SU=DA+f{&&t~2~*)e-o-pH#J0 zPnh?*YYK1c5yi<8o&dvy5sXIJ<}_t%>(lalL?njm|W zEaE&gW^VjpKs@jgqP8|_%GWwh-d!HDbm3fSr#QXGO3*tsH8*zH2d_{6s%sB!V2mN% z&EG=~L&wT3bVt$#>hSyXN2)kpCvKE?9&Y;W2 z1_8HxD?9PZAzEH7?rLb|KwO$` z=yZNrD-a^$IgJj_#H;UqOgG(Ky=z!}t=|Oh91bGq1c$59K;iKXk0bycX$d4cAVu57ju2<}1KE zW_D6ArAm*oqe<&j(@}c;SuIX{<~15^e~@ULM07J-x)|5hG8?cddc6NQY>(k%%+&n{ z{%%9nj27`rN9l%zC;A-%cWo(Z#W{?@#=ydho9us@3<*yI8sjt|c|h*(k(316bN_T} z_n*Qjvbo(pCykZ17}M==#EJ{>WHWedj6nG+_rWN?pm1cy*%Z;WbQW>%WwIZIs%-MF zKDak+9QW>Dcm;%Uap6ici@fY3)3`k+@pTdHU-}24TLbdY=Cvd2hC!EaxR(qWL-b2q!x#dQr-N6r3hZiX?iYRNnPGY1mHqf^^DpB$}A zLETKxJzvo044r<{hKhpZ+=;=c#-c0#p^P?FlO?cD?gcaPr2mVGIUP`H^IS}vhmXPT zY~+o`w@JSo#*)I{mhnAx&fMN^o$z%0Jm~Zph1M3NURe3__USyi$STFmS`BA%$Qt=W zTguVV&^%=#fZ(q2)9$Z}TZzuA8`e|LzMNny_U*{iZZnSg1~u=E3r5ru-?kp%l747b zq5pvH!mYv1G~j2Igs-};8)dX~P+$y#$tI_B|Ik&xCTIhoOS!*OKr({M-ZXaG-YI>L z4FW9vl2(qB5z;pie*&3)DWe3WG@m$h7H=Zxu-F%O%!X|CqbwR!PODF?7Dx zl3!PYf~A;B<+<;-}kgYOQEgIe&djy8Ya>|$Ka*YT~kD%lUb)CE3>aH=asD;s!yFH?QB6|g^TVba1w%X( z2C!y}T{S*@DWCXia3bT)f22(P1B9llEcP!oDzo(AM;>n#KfuesCc?dU-Z5m*!?6e{^Stf*qnd+ z$rOi4KbuNSe@5OPy2f>wG_95<_j+r~WUP8~<66E~FQGZ9sOAw!IlS5+@+A4m!wwR> zp+O~^{k2bwy9eUo(=Uha{dnctdWg%NVRcDr$=_sXhrOl%gv;}C>TLb{&xK&~Q^+Rv zmx=sR6U=t6SeY(;f-o+x(`}`V{s12X`_&`{7L;fvJD_WUZyoGYNa=f?>ym5XJ&Rm7 z7!%a%1?D)msa1TTm^v6)ey@r#YG7ulY!jfzfbpDZ!E!YxCbqfjdDL1lK+o5#u2fd2 z6nWj1Kl(I0RwhIo2g{u+(PORTD+-Dsq4%1+(f%l5Sz z8&xUnf#@`Zx4NC{fmvoohS#d>3bineu|TfZ!e*GL@2Md99o_tRIVAkcyRdNlGUxJ_ zF&ph%!A??ihj3qB4Ay<}m#y?Z(8Tlurqiq0iDeAk!L3av{{@p2YyL>m6=dVV+FUa% zVJhikKN-M`W+trr;TDK zW%0X?=L3m?iV1T~?=q(!VbS=cQhQ>o-=#!5Q0ef9TL{>vxY|IS98=VI8^Oyp-*7+m zR|>ZAY(yeWjuH&jul|!X^k@4oLZ%=-^DGAi!SA*V0q5Aw_wXitl25Ftk(Wu%T1ICq z^y}PvZjv^O2mHLa*Uj=1U;7zeyo-V*XZ4+P>?vei-3D`CI{SULv_Bbt6Dyb5R}U@Q zWT6~?G9AH=vJjRTy?7LD_9{^qD9^lA`V%i{@`pXHiJ~KK$NrD0B?MS+B*BL*2il^x zdL6?@g~TtiN%TQ*wl^)yq(!e1ExX%3}8yTN*lkuC?T!dV-vU|o)6T?c zn{$}N|aA%w08PTG(Kse;loZGhvJD+uCJ9G)ksv)3TyC$ z(2-5$wy4=u$9q~k&NRTKfC*0CHa!|@ zf?9Ve)s8Be3S_qwpV&F`gN8TP(lv@xaoUN42C`tGMfO^O>^T>PQFeozd`WgnFP}7v z)OR8D?0WMreG@~Stf4ivXzJYhk=kxVYQghd&qzyjr_L7BHeRv~y|d(H#(%(Y0x+U= zzAzX+*C)rG)NcApS-y_H99MhA+7?_#{e`5bHaAhheTI;%j~ANGo;NA$9Pbx#*4ctq zHdZ6w{+6zI{?}_&j0dX(ktOHxS(7XOAn0mlsn01O`Fw@Fn77pYTnh1C_8SYNUDs467^m47|s3gWU@L#U!D{`v5GveUf@hjixQ}N1)AQvll9#jMQ=V$rU^RVDPV5y41JQ^psM2RLAYF`S4o&ZJ9VJF3yhUT;f~( za+k>>khX-qc;_TWrsi+1oce-&LW)szLu}vBo0gH@Nr@Q*R6u79lA^EuLwyK(6~fUn zV?fB$U!biME#sJgV~2beLsK?KDPjg*H`^fVOY6Le|=*BO)Q2` z^L3AO4!#{w-V0kt-0?XL8?c=s!#>^6S7v%A)0A}zz0dAS1q*#lPPYEBQ?2miem}805j!9fCRaOt1Ixkv?9hYUbSa?XqAZ5=7wKa&G^_6K0pOe0r zd@I~n>ahyX4Tk?SM}8T!Q>9s|=iOR-3e5R6XxKK$ct=pUgQYarwDY>)nc^df-qBZ- z(t^0vYM`(keOdDSo25x%Tt;^@Gs@ziNO|2v6k9PDy$XE8xC)Fz%kXxzjV*$7$fI@E z>eOYOhT&En7HUrp@f8dW?zzR_gXSsB*w{JHkR?JhSk4MHuqqDEJuUi*3Z;a`oA zQgpc!)Fg(dKx?fCN=>-1NdkcReH!U7yv4x?OFFEhk9&NZ1%As>HTodMYAUFG_T9bn)joNLU*> zP1MUZajv6)#uCdLV*u4_O@(g@LzK~L91p5~2vJd^H}zlNmyFb?s~iocRP&&wwQ=## ze1pc7It{45tTbnS!C;?yb)`v>u}`bcChO6fNFuWD))2!Xu$%h^{wH{Ozge;~J|IV# zp4#T+y;h#WJ|3f*Lk~oVad1?Ao(h#-O1uJCU!UYZpAgn*KH1|TmzlY zDHh<|b1LE*4A~o4bzv5AIfl@;&n}bFq{)3t-|C!a*MGL)>pQQ~x_oihKiSvV+Olu5-peK-; zm#V#N1^{5C_^GL{;j#ag%fiE|g1CG+p&|aPMsG3>VK&jmJ{>u7}0AucJY{pN0Vq4P7r-n5CMp zZ(wICT&=H%9bC( zL_@2Gryn=nA6Ey0S|MN|3kTv72Cs{RHuHMwpK#uj zdV;AN-iJ+~W;4DlFzM0UI4q65xJ^`RCy6(v{-dn!m(vZ?d4lmLr?9oO$9`kum)d5L z;bv)qRGda-?#n<$J2060QZboN&6-Vk#ADJA5?H(rG$T8!=Vd?D%E_z=TAR$ItUJG| z5~I~jqqegAlR$QHtaeiKW27A(cCMm_NlTCFocZ#Vry$P*lo(&Xwfu8RYQR%$V~Z|O@`+M4sa1-UT-7xK}En9NPg3CgS)=Dl90OD^v5^q19x1{gS79ofapZyNli8Y9m z{U@MGztpoSyeea;tIXdR)^GLc1OIXz%e`yTZFVy5xDR@)GnCZeJS|ZswJ~4S^?2E# z&HZb=Gans&dq}f|Pvkr_pOv&UwhxWUmR8Utd>;+xReyp%`C(}jt=T32{Ea?K^-K^I$7#|&IDQhLakb-&&a}am{kciEMlqLVnPb;ilaJsL z>lqayamiZiAXY@7Glg$yBsf1BZFb!LTmk>s)WB-$F_x)3E-ZIhv^tRt!yMOH7@%Td zQ|{sfk;Kw9iKVf2owAwuoE|UaqclRucQ|yZ4Q5gwJs8JDbuqpiEQPh48Yn$^C0#DK zKI>KhvTUUT944m?xzClEsEzCpj1D`b;J)JOP*D1>#FqSN78dEUur4JJ8fu;f_|x+} zPpLTXWzR<$(~E_v?GF_}h}K0MN0m4!Djtja*;~}eF+-lNrnBFcMZD1wpHwZ@&*Zm; z$1IMgz|4%gGldk-8yOet7bqo@#ECh2^-m#96{oSGQIV;~aDFBxU)(uYJ^bpf{qa=wwVk~X23GH>WAjtm zg|)J%0V~tA$|!ZYxwrF_SXBpf3PtpTklQ4a*5Q)y0jh*Hl(=hc+jucc@Qx(EO8Df) z&K^dlGA&-7@8!iFA_fKE@{fjuOJwC)dBtaRw;Wjpun_%}#LM=HV_s!eqW)!U){f5Tv&iPLAZ9G02 zI(}1pY5CG{o!%Vq4bh`4T7LsEHi;#di&A1A2Dgq}~GTer8> zzPwsG8ta?NJz$`(c1MFwP%m7u?^$fozs}3Gq}NJL6bb=(qH%7LXYMUtjW?v(E|q^H z;|zC)WZkM|d!qWpd%KdymdZbJjvY%4TWz13b}i9hxc_EY{~_Z3H+J~{7^GPu0HXDn z`=s6aUIRYoCjh{beUH$7kjRs(rLyqLrWpN?PYodeG6xQ6@jw3EtltR1y`ZZ9#&6=? zA$}Xi;S-*G2790l|Cew;RUe%_&_AO2E9?Ncbb@cXS^(T|zl!29-2avp0FcJNUVp6r zaj;7SfE?8%{zL8o$kqVhbN$c|7XK%Q|3MOiFaOVFIN-O`H~`uIF^yBoxNjy&fnj1q%P?FrOE|4kc&+J}@Hawc{`+-$%1oeNhCv_kTO$1*>eYj7+ZwKU0sV`=m1M zd;}F&Cp6OSgfvx}6qxsWBcyA8^avPeN#34qsf$gGgDPBQ0!n13VC_NJq`@N6XbdP( zRoFhG;B-#0Au!lmb~V`%kouioixyq*7?ArfjSAf@{`$8I6kEq9RzZ?Nk3Q`$v(GV@ z>VQRllqhjOl%pb{*A~8=@G97K)_Q7=vPqV&NBBi%PcpMzXnzf4g3>kJK$))f{W%nT z_P>y^{A#mDsp)xlH5U=^1f)twEE&(G_}wLLFZc5jtpoG3s*|sb80Qle+Bui=U#if( zed9zWeUQg!_+UBIe(RQ{cC5reEDfr6mbt&`i}g2Zjo&Fy=ZSOp5D7kQL@afSYqDCv zYDT!K8m7c^f0D&cfC#H&|N9$rI>w$PP!%eod3Mq$X-nXQGY=bW%WcjEiviNHw-1(? z*i=+O$qn0;!Lr00PUy3Xgt5S!XOB#{g^U|NYc6}O+QRvolU0+Y0R7x7m&2Ckz^ekC zNNPWdl}sS|eAh)y+Di=T5$%iQv4I35fW?XtqUZC9yN4xf{j%1o&w&AoU zEL&d*J`r%_xgG?=r<`h(f2ja@&veScJw9l+6#mmADjdhlaT{B%O z&aZeUTz9H4-4IxT%?~jo*?=@VTi0*rNT(fysqjCk8`!S&Rmt~Z`LwEGx^h#P7Yi)+$=es(q#B0~|w zx;%|p>!5T@wP$x1V?D<|D6_v~?Xf0xrGM~@1kAGk)NqmYQzcAt`j>!WR4f#?$yC`5 zYNHy0n5QAifk^b%?L)kMCn)M4!t5t6%nB!a&b&OF58_3xQq$x%eP}AFU;Ef??e=Zq zU2MGATSJhmFbpI-F*5NilhP}cF?DC?5p#q%I1`Qb_6(J2-T1+*^+b^x%v$CZ5FM>apv$zJt#=WSsl-`Lm z*R$1vIzEUP;$mY{q0&vkB7$|pkmb&;28v?0=D37538d%)zl3b43QUaza&i;C9{X#I zN6Sthq<A+dKu4$HfkoKNKaA~S1 z7=OWSd4EC`teqF=N3-Bw21CU}`9r3I&+tXEWI0{*&4c9SonxCHZar$#p3reaY*jE! zNtCxv_^%)b>aPu5Emsd%ktxyaZ3QWK55KoRo9!&geL{_Rybb93Az(CJ^ZbdAPo3{t zM5;E?Bl?As41Ts`1xn>mIMr!usK1{fe2hgobU^mrc@FYd9OHe52g7tfG?1|iqQHe>U_uR*TtErHuHq$oD`NXJ-x z5$C~nd4L&Pcf!Nru*noG%Iugh|8U(Y*H_@_!L8Fo-wN8sRuQz%V%haG1j=CNGZ?13 z-B%DM6n8N$zQ#S6;b7#~o$XrfZB7={j_Si&1)GWLi;#>qLWvp#lnPtEt@f$xv)v0- zXm23MT-F!fBHbs5L!_b?`0&)eY0wA(39^ex!fPnBQy$St%%VJ{L5muHW4t+GX(TLmx^n1xxCRA(NcWViQnT0GZpUDP@1JPfekt!Z z&A<^q@h1RG3;AmF6f>;ubc>8LqOUr1R$3)fUB(Ez&neq)?s52In}*kGEy`c)=;to% za3o^E=QG*49Agu~Og@snkrzXPx{0})>t^l*4KT)>{+;O-QpYqhx#!cBkI^qDD^zIF z3ulhEJJDrF`D61F_?{>3*WUV>3e)AEtIpSf^LK~O$B#=fTO7bbWYT_k_LH84c*Sdf ze{id~RZB43UUniVJD{=A>H@2KZPwfE#wZ{2<^^u+{0Kax3Em8lR-g#q=^kC$&Im+I z(I#mGFECxdnmL)SGh}YQ84`Uqne*uxAmm7VC0Hk1L8_420GBYQ0fN2HXhjGaOh?aw znY;+1Ck3JOawGaRO%DEUt*PA8)>~wf+MGiLMU;dkc2(}Vh3xvY(n=}!0?k&ioc0&0 zMaM|_nP1HlCQR#JlhX!C$r>mIw*x{@FYEH%%ULYZ`96p1HN&w-^uJWqu>ky}uLv4H zP09P(@(gA$pLYTmceU$e?j{x{4+ zLViwVaj%MHBliqw zh%^Rb!So|CwbnViydh4`^NH{Wi0S#j;;hoB2%uYIvcPsa@q5|ZCIkz%w{3>;R@CkC z{VtVs{FtjdO`!6RNzQeJKIi|%+AVQ3e>_$pkhsEi_c@In1g8zem6q9Cl~LtDtTR8z z{%)9DPdUnJfixEOtJ!}JiG8tQB;bQojUNoAA#Hw3$zfjqvLNaQPw{R%y@Oo$ekD1V zW_${gvIcci9kpi+&*@|q-VuNe+`SBe5X%gP?TxN+_>1=iG-Qn7I7IS?w^@0A%Vs@r zIy^BOLuyY+cq0`uUaTfsS`*`8f6neRQ{`~5W7vfWaob{6^j3vo2N6Wbq!X+|LnFki zGp*66Ebcw^&47qu3&Fu9>||6UJ`s(<77NM@Tw!PSwGU^dt6XF1*Bjf#+zuV{8^Ux! z736#dko{l42rrIG*D06D5Sn#&-U_a*E4(plZ-Oz{+(&3+e`LB(?{SpZ?`DmI!p?a5FMcgMpF4=86 z+7*EI-SPqNHt3XBkr2nkIcB2=L%@_6A3Xw5in&{_w)`YoSso6RruBn&1lO-jkFY3$ zjLPMPqdDjuH{Jry-030B78KASq?pe&D%d45TIt5Y9{lMGhS#AjS0wTWn`xews{xVC zhWRKaYu(q(%Cz<@`f%bMLt<)ujeg$V4{sUt!9#=SSCF5ehCqE&7+p`ogufB#3KvYCkj8Sq6V5B!Zd)EmP$oC$ z>vn#wX*F7`4^0Got+HGfp41gA3gWcyDfTq?71I0XT#Vg*%7I}aUKQRu4lnT>^b>u} z{p^ch*`01TBnCUhDzC5%HwK#x(*BI?Rf0J3 zl&MPs34X;^aK)L^v^huC{v4)aLUc6(6+Cs%?zA?3U*gNRcwq~+YMH3`+%cP_EK`d( zHjs#gkMOa3?>o5T5ucfq)jx4~;o#8S#hpcaIUI*i)ijN&9_+|MpH(3IVJ>q7+&JeLF{g8a*&UYko&eF{OwwZRU*(ZultF>3nExfnyubJfz;=-AP+iPm>0^fm2 zSk0w!v?$O%kjVs}TF!90`E*?g&OuL|JZ-1t`&zwlaM`O|&Z35JzLC#HqJDWZjre2u zmpuzE7kr|+7(v9}q1hm0JR`Uk>vDefKh(#QqV}%w`7ABzHtb09QyCUJSKfyMrXFV2 z;~Ay|1q`sYcN1OAL#p;C*-;ptxd6dbz}n-R=GcmHl3LZ&FWG z&dqKmkhdg8kjXJ-WHnxsODabtlx7xQ(7v(-bplbcUIGh+VElg=BOsoMdYUBPXz#j&I%s|BB0k#7EcqPSalOz$LpH)`q6TQYk7zP=B#0_>`^Q)*rcb-;){oy1s?y4JQoTPsw&*lR?o z9tI9(t$qT$>a$6i=ICL3&US9$KBp~&KW9;t0MWh)s7BM+v8nfzoldZ8$5kLG1{m70 zmT>PJ^SZ^GDe@R|z%imZ%4%kV#%hK%KbB|Av}eHoNpPuo5$FYd6A+xJT++EsP66LxHZpRMpN-q;St=E&4P zb~5iVIpgTua1k*lD|4KGlZ{>p0UtU z87u~d+gP2ygwS~gMaCuRC;XAE)`veTQKNq|> z8hnB7FV=nt4mZUmCqf^^!wafbt=_P*g`-XLh6LWTtOG$O0ReIGe*Z53N22(p4oJ=p zvhGT4jeuMZcpH-Aj|=!u73>37+2 z;e^Zf#mN*`<}C>Chl7Bk%rIQ0j$E&h_d;pj+85%zhrct@qwT~om_ywo$zdXSvJEaC z38;<|-VVJFw~r7GKrs(4Z}|3WwPxC!DsUBcgE-u1CpqFopA+{^^~8UUi8@>c^9b`l zl7a+9wOj2vFB=+fR&HWpFzB=3d>EA{QZ6K%jo1af&y?a>E0FCM;Rf$%viEH`q6?{| zR`$-rbGr&G-0#TcEooRY51p*~vXVsNz)DyKc_Ht(JI#ry>XcHT7q?VcY0cG~ifc

    +Cm{wzfz43m40*@&ejZqglvfyH>z^?yNTCqM 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 diff --git a/1-js/9-prototypes/4-classes/1-rewrite-by-class/solution.md b/1-js/9-prototypes/4-classes/1-rewrite-by-class/solution.md deleted file mode 100644 index a43508c8..00000000 --- a/1-js/9-prototypes/4-classes/1-rewrite-by-class/solution.md +++ /dev/null @@ -1,32 +0,0 @@ - - -```js -//+ run -function CoffeeMachine(power) { - // свойства конкретной кофеварки - this._power = power; - this._waterAmount = 0; -} - -// свойства и методы для всех объектов класса -CoffeeMachine.prototype.WATER_HEAT_CAPACITY = 4200; - -CoffeeMachine.prototype._getTimeToBoil = function() { - return this._waterAmount * this.WATER_HEAT_CAPACITY * 80 / this._power; -}; - -CoffeeMachine.prototype.run = function() { - setTimeout(function() { - alert( 'Кофе готов!' ); - }, this._getTimeToBoil()); -}; - -CoffeeMachine.prototype.setWaterAmount = function(amount) { - this._waterAmount = amount; -}; - -var coffeeMachine = new CoffeeMachine(10000); -coffeeMachine.setWaterAmount(50); -coffeeMachine.run(); -``` - diff --git a/1-js/9-prototypes/4-classes/1-rewrite-by-class/task.md b/1-js/9-prototypes/4-classes/1-rewrite-by-class/task.md deleted file mode 100644 index cfc8aa91..00000000 --- a/1-js/9-prototypes/4-classes/1-rewrite-by-class/task.md +++ /dev/null @@ -1,39 +0,0 @@ -# Перепишите в виде класса - -[importance 5] - -Есть класс `CoffeeMachine`, заданный в функциональном стиле. - -Задача: переписать `CoffeeMachine` в виде класса с использованием прототипа. - -Исходный код: - -```js -//+ run -function CoffeeMachine(power) { - var waterAmount = 0; - - var WATER_HEAT_CAPACITY = 4200; - - function getTimeToBoil() { - return waterAmount * WATER_HEAT_CAPACITY * 80 / power; - } - - this.run = function() { - setTimeout(function() { - alert( 'Кофе готов!' ); - }, getTimeToBoil()); - }; - - this.setWaterAmount = function(amount) { - waterAmount = amount; - }; - -} - -var coffeeMachine = new CoffeeMachine(10000); -coffeeMachine.setWaterAmount(50); -coffeeMachine.run(); -``` - -P.S. При описании через прототипы локальные переменные недоступны методам, поэтому нужно будет переделать их в защищённые свойства. diff --git a/1-js/9-prototypes/4-classes/2-hamsters-with-proto/solution.md b/1-js/9-prototypes/4-classes/2-hamsters-with-proto/solution.md deleted file mode 100644 index 113334fd..00000000 --- a/1-js/9-prototypes/4-classes/2-hamsters-with-proto/solution.md +++ /dev/null @@ -1,52 +0,0 @@ -# Почему возникает проблема - -Давайте подробнее разберем происходящее при вызове `speedy.found("яблоко")`: -

      -
    1. Интерпретатор ищет свойство `found` в `speedy`. Но `speedy` -- пустой объект, т.к. `new Hamster` ничего не делает с `this`.
    2. -
    3. Интерпретатор идёт по ссылке `speedy.__proto__ (==Hamster.prototype)` и находят там метод `found`, запускает его.
    4. -
    5. Значение `this` устанавливается в объект перед точкой, т.е. в `speedy`.
    6. -
    7. Для выполнения `this.food.push()` нужно найти свойство `this.food`. Оно отсутствует в `speedy`, но есть в `speedy.__proto__`.
    8. -
    9. Значение `"яблоко"` добавляется в `speedy.__proto__.food`.
    10. -
    - -**У всех хомяков общий живот!** Или, в терминах JavaScript, свойство `food` изменяется в прототипе, который является общим для всех объектов-хомяков. - -Заметим, что этой проблемы не было бы при простом присваивании: - -```js -this.food = something; -``` - -В этом случае значение записалось бы в сам объект, без поиска `found` в прототипе. - -**Проблема возникает только со свойствами-объектами в прототипе.** - -Исправьте её? - -# Исправление - -Для исправления проблемы нужно дать каждому хомяку свой живот. Это можно сделать, присвоив его в конструкторе. - -```js -//+ run -function Hamster() { -*!* - this.food = []; -*/!* -} - -Hamster.prototype.found = function(something) { - this.food.push(something); -}; - -speedy = new Hamster(); -lazy = new Hamster(); - -speedy.found("яблоко"); -speedy.found("орех"); - -alert(speedy.food.length) // 2 -alert(lazy.food.length) // 0(!) -``` - -Теперь всё в порядке. У каждого хомяка -- свой живот. \ No newline at end of file diff --git a/1-js/9-prototypes/4-classes/2-hamsters-with-proto/task.md b/1-js/9-prototypes/4-classes/2-hamsters-with-proto/task.md deleted file mode 100644 index 48aa3220..00000000 --- a/1-js/9-prototypes/4-classes/2-hamsters-with-proto/task.md +++ /dev/null @@ -1,33 +0,0 @@ -# Хомяки с __proto__ - -[importance 5] - -Вы -- руководитель команды, которая разрабатывает игру, хомяковую ферму. Один из программистов получил задание создать класс "хомяк" (англ - `"Hamster"`). - -Объекты-хомяки должны иметь массив `food` для хранения еды и метод `found`, который добавляет к нему. - -Ниже -- его решение. При создании двух хомяков, если поел один -- почему-то сытым становится и второй тоже. - -В чём дело? Как поправить? - -```js -//+ run -function Hamster() {} - -Hamster.prototype.food = []; // пустой "живот" - -Hamster.prototype.found = function(something) { - this.food.push(something); -}; - -// Создаём двух хомяков и кормим первого -var speedy = new Hamster(); -var lazy = new Hamster(); - -speedy.found("яблоко"); -speedy.found("орех"); - -alert( speedy.food.length ); // 2 -alert( lazy.food.length ); // 2 (!??) -``` - diff --git a/1-js/9-prototypes/4-classes/article.md b/1-js/9-prototypes/4-classes/article.md deleted file mode 100644 index 082c22f2..00000000 --- a/1-js/9-prototypes/4-classes/article.md +++ /dev/null @@ -1,128 +0,0 @@ -# Свои классы на прототипах - -Используем ту же структуру, что JavaScript использует внутри себя, для объявления своих классов. - -[cut] -## Обычный конструктор - -Вспомним, как мы объявляли классы ранее. - -Например, этот код задаёт класс `Animal` в функциональном стиле, без всяких прототипов: - -```js -//+ run -function Animal(name) { - this.speed = 0; - this.name = name; - - this.run = function(speed) { - this.speed += speed; - alert( this.name + ' бежит, скорость ' + this.speed ); - }; - - this.stop = function() { - this.speed = 0; - alert( this.name + ' стоит' ); - }; -}; - -var animal = new Animal('Зверь'); - -alert( animal.speed ); // 0, начальная скорость -animal.run(3); // Зверь бежит, скорость 3 -animal.run(10); // Зверь бежит, скорость 13 -animal.stop(); // Зверь стоит -``` - -## Класс через прототип - -А теперь создадим аналогичный класс, используя прототипы, наподобие того, как сделаны классы `Object`, `Date` и остальные. - -Чтобы объявить свой класс, нужно: - -
      -
    1. Объявить функцию-конструктор.
    2. -
    3. Записать методы и свойства, нужные всем объектам класса, в `prototype`.
    4. -
    - -Опишем класс `Animal`: - -```js -//+ run -// конструктор -function Animal(name) { - this.name = name; - this.speed = 0; -} - -// методы в прототипе -Animal.prototype.run = function(speed) { - this.speed += speed; - alert( this.name + ' бежит, скорость ' + this.speed ); -}; - -Animal.prototype.stop = function() { - this.speed = 0; - alert( this.name + ' стоит' ); -}; - -var animal = new Animal('Зверь'); - -alert( animal.speed ); // 0, свойство взято из прототипа -animal.run(5); // Зверь бежит, скорость 5 -animal.run(5); // Зверь бежит, скорость 10 -animal.stop(); // Зверь стоит -``` - -В объекте `animal` будут хранится свойства конкретного экземпляра: `name` и `speed`, а общие методы -- в прототипе. - -Совершенно такой же подход, как и для встроенных классов в JavaScript. - -## Сравнение - -Чем такое задание класса лучше и хуже функционального стиля? - -[compare] -+Функциональный стиль записывает в каждый объект и свойства и методы, а прототипный -- только свойства. Поэтому прототипный стиль -- быстрее и экономнее по памяти. --При создании методов через прототип, мы теряем возможность использовать локальные переменные как приватные свойства, у них больше нет общей области видимости с конструктором. -[/compare] - -Таким образом, прототипный стиль -- быстрее и экономнее, но немного менее удобен. - -К примеру, есть у нас приватное свойство `name` и метод `sayHi` в функциональном стиле ООП: - -```js -//+ run -function Animal(name) { - this.sayHi = function() { -*!* - alert( name ); -*/!* - }; -} - -var animal = new Animal("Зверь"); -animal.sayHi(); // Зверь -``` - -При задании методов в прототипе мы не сможем её так оставить, ведь методы находятся *вне* конструктора, у них нет общей области видимости, поэтому приходится записывать `name` в сам объект, обозначив его как защищённое: - -```js -//+ run -function Animal(name) { -*!* - this._name = name; -*/!* -} - -Animal.prototype.sayHi = function() { -*!* - alert( this._name ); -*/!* -} - -var animal = new Animal("Зверь"); -animal.sayHi(); // Зверь -``` - -Впрочем, недостаток этот -- довольно условный. Ведь при наследовании в функциональном стиле также пришлось бы писать `this._name`, чтобы потомок получил доступ к этому значению. diff --git a/1-js/9-prototypes/5-class-inheritance/1-inheritance-error-assign/solution.md b/1-js/9-prototypes/5-class-inheritance/1-inheritance-error-assign/solution.md deleted file mode 100644 index 8987b2d7..00000000 --- a/1-js/9-prototypes/5-class-inheritance/1-inheritance-error-assign/solution.md +++ /dev/null @@ -1,44 +0,0 @@ -Ошибка в строке: - -```js -Rabbit.prototype = Animal.prototype; -``` - -Эта ошибка приведёт к тому, что `Rabbit.prototype` и `Animal.prototype` -- один и тот же объект. В результате методы `Rabbit` будут помещены в него и, при совпадении, перезапишут методы `Animal`. - -Получится, что все животные прыгают, вот пример: - -```js -//+ run no-beautify -function Animal(name) { - this.name = name; -} - -Animal.prototype.walk = function() { - alert("ходит " + this.name); -}; - -function Rabbit(name) { - this.name = name; -} -*!* -Rabbit.prototype = Animal.prototype; -*/!* - -Rabbit.prototype.walk = function() { - alert("прыгает! и ходит: " + this.name); -}; - -*!* -var animal = new Animal("Хрюшка"); -animal.walk(); // прыгает! и ходит Хрюшка -*/!* -``` - -Правильный вариант этой строки: - -```js -Rabbit.prototype = Object.create(Animal.prototype); -``` - -Если так написать, то в `Rabbit.prototype` будет отдельный объект, который прототипно наследует от `Animal.prototype`, но может содержать и свои свойства, специфичные для кроликов. diff --git a/1-js/9-prototypes/5-class-inheritance/1-inheritance-error-assign/task.md b/1-js/9-prototypes/5-class-inheritance/1-inheritance-error-assign/task.md deleted file mode 100644 index ddb177e9..00000000 --- a/1-js/9-prototypes/5-class-inheritance/1-inheritance-error-assign/task.md +++ /dev/null @@ -1,25 +0,0 @@ -# Найдите ошибку в наследовании - -[importance 5] - -Найдите ошибку в прототипном наследовании. К чему она приведёт? - -```js -function Animal(name) { - this.name = name; -} - -Animal.prototype.walk = function() { - alert( "ходит " + this.name ); -}; - -function Rabbit(name) { - this.name = name; -} -Rabbit.prototype = Animal.prototype; - -Rabbit.prototype.walk = function() { - alert( "прыгает! и ходит: " + this.name ); -}; -``` - diff --git a/1-js/9-prototypes/5-class-inheritance/2-inheritance-error-constructor/solution.md b/1-js/9-prototypes/5-class-inheritance/2-inheritance-error-constructor/solution.md deleted file mode 100644 index 19384566..00000000 --- a/1-js/9-prototypes/5-class-inheritance/2-inheritance-error-constructor/solution.md +++ /dev/null @@ -1,18 +0,0 @@ -Ошибка -- в том, что метод `walk` присваивается в конструкторе `Animal` самому объекту вместо прототипа. - -Поэтому, если мы решим перезаписать этот метод своим, специфичным для кролика, то он не сработает: - -```js -// ... - -// записывается в прототип -Rabbit.prototype.walk = function() { - alert( "прыгает " + this.name ); -}; -``` - -Метод `this.walk` из `Animal` записывается в сам объект, и поэтому он всегда будет первым, игнорируя цепочку прототипов. - -Правильно было бы определять `walk` как `Animal.prototype.walk`. - -Тем более, что этот метод является общим для всех объектов, тратить память и время на запись его в каждый конструктор определённо ни к чему. \ No newline at end of file diff --git a/1-js/9-prototypes/5-class-inheritance/2-inheritance-error-constructor/task.md b/1-js/9-prototypes/5-class-inheritance/2-inheritance-error-constructor/task.md deleted file mode 100644 index b97447f5..00000000 --- a/1-js/9-prototypes/5-class-inheritance/2-inheritance-error-constructor/task.md +++ /dev/null @@ -1,30 +0,0 @@ -# В чём ошибка в наследовании - -[importance 5] - -Найдите ошибку в прототипном наследовании. К чему она приведёт? - -```js -//+ run -function Animal(name) { - this.name = name; - - this.walk = function() { - alert( "ходит " + this.name ); - }; - -} - -function Rabbit(name) { - Animal.apply(this, arguments); -} -Rabbit.prototype = Object.create(Animal.prototype); - -Rabbit.prototype.walk = function() { - alert( "прыгает " + this.name ); -}; - -var rabbit = new Rabbit("Кроль"); -rabbit.walk(); -``` - diff --git a/1-js/9-prototypes/5-class-inheritance/3-clock-class/clock.js b/1-js/9-prototypes/5-class-inheritance/3-clock-class/clock.js deleted file mode 100755 index 34fb026d..00000000 --- a/1-js/9-prototypes/5-class-inheritance/3-clock-class/clock.js +++ /dev/null @@ -1,32 +0,0 @@ -function Clock(options) { - this._template = options.template; -} - -Clock.prototype._render = function render() { - var date = new Date(); - - var hours = date.getHours(); - if (hours < 10) hours = '0' + hours; - - var min = date.getMinutes(); - if (min < 10) min = '0' + min; - - var sec = date.getSeconds(); - if (sec < 10) sec = '0' + sec; - - var output = this._template.replace('h', hours).replace('m', min).replace('s', sec); - - console.log(output); -}; - -Clock.prototype.stop = function() { - clearInterval(this._timer); -}; - -Clock.prototype.start = function() { - this._render(); - var self = this; - this._timer = setInterval(function() { - self._render(); - }, 1000); -}; \ No newline at end of file diff --git a/1-js/9-prototypes/5-class-inheritance/3-clock-class/solution.md b/1-js/9-prototypes/5-class-inheritance/3-clock-class/solution.md deleted file mode 100644 index d1c08b87..00000000 --- a/1-js/9-prototypes/5-class-inheritance/3-clock-class/solution.md +++ /dev/null @@ -1,7 +0,0 @@ - - -```js -//+ src="clock.js" -``` - -[edit src="solution"]Открыть полное решение[/edit] \ No newline at end of file diff --git a/1-js/9-prototypes/5-class-inheritance/3-clock-class/solution.view/clock.js b/1-js/9-prototypes/5-class-inheritance/3-clock-class/solution.view/clock.js deleted file mode 100755 index 34fb026d..00000000 --- a/1-js/9-prototypes/5-class-inheritance/3-clock-class/solution.view/clock.js +++ /dev/null @@ -1,32 +0,0 @@ -function Clock(options) { - this._template = options.template; -} - -Clock.prototype._render = function render() { - var date = new Date(); - - var hours = date.getHours(); - if (hours < 10) hours = '0' + hours; - - var min = date.getMinutes(); - if (min < 10) min = '0' + min; - - var sec = date.getSeconds(); - if (sec < 10) sec = '0' + sec; - - var output = this._template.replace('h', hours).replace('m', min).replace('s', sec); - - console.log(output); -}; - -Clock.prototype.stop = function() { - clearInterval(this._timer); -}; - -Clock.prototype.start = function() { - this._render(); - var self = this; - this._timer = setInterval(function() { - self._render(); - }, 1000); -}; \ No newline at end of file diff --git a/1-js/9-prototypes/5-class-inheritance/3-clock-class/solution.view/index.html b/1-js/9-prototypes/5-class-inheritance/3-clock-class/solution.view/index.html deleted file mode 100755 index ec1acda9..00000000 --- a/1-js/9-prototypes/5-class-inheritance/3-clock-class/solution.view/index.html +++ /dev/null @@ -1,21 +0,0 @@ - - - - - Часики в консоли - - - - - - - - - - - \ No newline at end of file diff --git a/1-js/9-prototypes/5-class-inheritance/3-clock-class/source.view/clock.js b/1-js/9-prototypes/5-class-inheritance/3-clock-class/source.view/clock.js deleted file mode 100755 index 87f457c6..00000000 --- a/1-js/9-prototypes/5-class-inheritance/3-clock-class/source.view/clock.js +++ /dev/null @@ -1,32 +0,0 @@ -function Clock(options) { - - var template = options.template; - var timer; - - function render() { - var date = new Date(); - - var hours = date.getHours(); - if (hours < 10) hours = '0' + hours; - - var min = date.getMinutes(); - if (min < 10) min = '0' + min; - - var sec = date.getSeconds(); - if (sec < 10) sec = '0' + sec; - - var output = template.replace('h', hours).replace('m', min).replace('s', sec); - - console.log(output); - } - - this.stop = function() { - clearInterval(timer); - }; - - this.start = function() { - render(); - timer = setInterval(render, 1000); - } - -} \ No newline at end of file diff --git a/1-js/9-prototypes/5-class-inheritance/3-clock-class/source.view/index.html b/1-js/9-prototypes/5-class-inheritance/3-clock-class/source.view/index.html deleted file mode 100755 index ec1acda9..00000000 --- a/1-js/9-prototypes/5-class-inheritance/3-clock-class/source.view/index.html +++ /dev/null @@ -1,21 +0,0 @@ - - - - - Часики в консоли - - - - - - - - - - - \ No newline at end of file diff --git a/1-js/9-prototypes/5-class-inheritance/3-clock-class/task.md b/1-js/9-prototypes/5-class-inheritance/3-clock-class/task.md deleted file mode 100644 index 59355fee..00000000 --- a/1-js/9-prototypes/5-class-inheritance/3-clock-class/task.md +++ /dev/null @@ -1,11 +0,0 @@ -# Класс "часы" - -[importance 5] - -Есть реализация часиков, оформленная в виде одной функции-конструктора. У неё есть приватные свойства `timer`, `template` и метод `render`. - -Задача: переписать часы на прототипах. Приватные свойства и методы сделать защищёнными. - - - -P.S. Часики тикают в браузерной консоли (надо открыть её, чтобы увидеть). \ No newline at end of file diff --git a/1-js/9-prototypes/5-class-inheritance/4-clock-class-extended/extended-clock.js b/1-js/9-prototypes/5-class-inheritance/4-clock-class-extended/extended-clock.js deleted file mode 100755 index 3e0bf9bd..00000000 --- a/1-js/9-prototypes/5-class-inheritance/4-clock-class-extended/extended-clock.js +++ /dev/null @@ -1,14 +0,0 @@ -function ExtendedClock(options) { - Clock.apply(this, arguments); - this._precision = +options.precision || 1000; -} - -ExtendedClock.prototype = Object.create(Clock.prototype); - -ExtendedClock.prototype.start = function() { - this._render(); - var self = this; - this._timer = setInterval(function() { - self._render(); - }, this._precision); -}; \ No newline at end of file diff --git a/1-js/9-prototypes/5-class-inheritance/4-clock-class-extended/solution.md b/1-js/9-prototypes/5-class-inheritance/4-clock-class-extended/solution.md deleted file mode 100644 index f58d46d8..00000000 --- a/1-js/9-prototypes/5-class-inheritance/4-clock-class-extended/solution.md +++ /dev/null @@ -1,7 +0,0 @@ -Наследник: - -```js -//+ src="extended-clock.js" -``` - -[edit src="solution"]Открыть полное решение в редакторе[/edit] \ No newline at end of file diff --git a/1-js/9-prototypes/5-class-inheritance/4-clock-class-extended/solution.view/clock.js b/1-js/9-prototypes/5-class-inheritance/4-clock-class-extended/solution.view/clock.js deleted file mode 100755 index 34fb026d..00000000 --- a/1-js/9-prototypes/5-class-inheritance/4-clock-class-extended/solution.view/clock.js +++ /dev/null @@ -1,32 +0,0 @@ -function Clock(options) { - this._template = options.template; -} - -Clock.prototype._render = function render() { - var date = new Date(); - - var hours = date.getHours(); - if (hours < 10) hours = '0' + hours; - - var min = date.getMinutes(); - if (min < 10) min = '0' + min; - - var sec = date.getSeconds(); - if (sec < 10) sec = '0' + sec; - - var output = this._template.replace('h', hours).replace('m', min).replace('s', sec); - - console.log(output); -}; - -Clock.prototype.stop = function() { - clearInterval(this._timer); -}; - -Clock.prototype.start = function() { - this._render(); - var self = this; - this._timer = setInterval(function() { - self._render(); - }, 1000); -}; \ No newline at end of file diff --git a/1-js/9-prototypes/5-class-inheritance/4-clock-class-extended/solution.view/extended-clock.js b/1-js/9-prototypes/5-class-inheritance/4-clock-class-extended/solution.view/extended-clock.js deleted file mode 100755 index 3e0bf9bd..00000000 --- a/1-js/9-prototypes/5-class-inheritance/4-clock-class-extended/solution.view/extended-clock.js +++ /dev/null @@ -1,14 +0,0 @@ -function ExtendedClock(options) { - Clock.apply(this, arguments); - this._precision = +options.precision || 1000; -} - -ExtendedClock.prototype = Object.create(Clock.prototype); - -ExtendedClock.prototype.start = function() { - this._render(); - var self = this; - this._timer = setInterval(function() { - self._render(); - }, this._precision); -}; \ No newline at end of file diff --git a/1-js/9-prototypes/5-class-inheritance/4-clock-class-extended/solution.view/index.html b/1-js/9-prototypes/5-class-inheritance/4-clock-class-extended/solution.view/index.html deleted file mode 100755 index c226468c..00000000 --- a/1-js/9-prototypes/5-class-inheritance/4-clock-class-extended/solution.view/index.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - Часики в консоли - - - - - - - - - - - - - - \ No newline at end of file diff --git a/1-js/9-prototypes/5-class-inheritance/4-clock-class-extended/source.view/clock.js b/1-js/9-prototypes/5-class-inheritance/4-clock-class-extended/source.view/clock.js deleted file mode 100755 index 34fb026d..00000000 --- a/1-js/9-prototypes/5-class-inheritance/4-clock-class-extended/source.view/clock.js +++ /dev/null @@ -1,32 +0,0 @@ -function Clock(options) { - this._template = options.template; -} - -Clock.prototype._render = function render() { - var date = new Date(); - - var hours = date.getHours(); - if (hours < 10) hours = '0' + hours; - - var min = date.getMinutes(); - if (min < 10) min = '0' + min; - - var sec = date.getSeconds(); - if (sec < 10) sec = '0' + sec; - - var output = this._template.replace('h', hours).replace('m', min).replace('s', sec); - - console.log(output); -}; - -Clock.prototype.stop = function() { - clearInterval(this._timer); -}; - -Clock.prototype.start = function() { - this._render(); - var self = this; - this._timer = setInterval(function() { - self._render(); - }, 1000); -}; \ No newline at end of file diff --git a/1-js/9-prototypes/5-class-inheritance/4-clock-class-extended/source.view/extended-clock.js b/1-js/9-prototypes/5-class-inheritance/4-clock-class-extended/source.view/extended-clock.js deleted file mode 100755 index 3b3efe1e..00000000 --- a/1-js/9-prototypes/5-class-inheritance/4-clock-class-extended/source.view/extended-clock.js +++ /dev/null @@ -1,13 +0,0 @@ -function extend(Child, Parent) { - Child.prototype = inherit(Parent.prototype); - Child.prototype.constructor = Child; - Child.parent = Parent.prototype; -} - -function inherit(proto) { - function F() {} - F.prototype = proto; - return new F; -} - -// ваш код \ No newline at end of file diff --git a/1-js/9-prototypes/5-class-inheritance/4-clock-class-extended/source.view/index.html b/1-js/9-prototypes/5-class-inheritance/4-clock-class-extended/source.view/index.html deleted file mode 100755 index 4aac9ceb..00000000 --- a/1-js/9-prototypes/5-class-inheritance/4-clock-class-extended/source.view/index.html +++ /dev/null @@ -1,35 +0,0 @@ - - - - - Часики в консоли - - - - - - - - - - - - \ No newline at end of file diff --git a/1-js/9-prototypes/5-class-inheritance/4-clock-class-extended/task.md b/1-js/9-prototypes/5-class-inheritance/4-clock-class-extended/task.md deleted file mode 100644 index 94bee22a..00000000 --- a/1-js/9-prototypes/5-class-inheritance/4-clock-class-extended/task.md +++ /dev/null @@ -1,15 +0,0 @@ -# Класс "расширенные часы" - -[importance 5] - -Есть реализация часиков на прототипах. Создайте класс, расширяющий её, добавляющий поддержку параметра `precision`, который будет задавать частоту тика в `setInterval`. Значение по умолчанию: `1000`. - - - -
      -
    • Для этого класс `Clock` надо унаследовать. Пишите ваш новый код в файле `extended-clock.js`.
    • -
    • Исходный класс `Clock` менять нельзя.
    • -
    • Пусть конструктор потомка вызывает конструктор родителя. Это позволит избежать проблем при расширении `Clock` новыми опциями.
    • -
    - -P.S. Часики тикают в браузерной консоли (надо открыть её, чтобы увидеть). \ No newline at end of file diff --git a/1-js/9-prototypes/5-class-inheritance/5-menu-timer-animated/solution.md b/1-js/9-prototypes/5-class-inheritance/5-menu-timer-animated/solution.md deleted file mode 100644 index 9cb942f7..00000000 --- a/1-js/9-prototypes/5-class-inheritance/5-menu-timer-animated/solution.md +++ /dev/null @@ -1,3 +0,0 @@ -[edit src="solution"]Открыть решение в редакторе[/edit] - -Обратите внимание: константы состояний перенесены в прототип, чтобы `AnimatingMenu` их тоже унаследовал. diff --git a/1-js/9-prototypes/5-class-inheritance/5-menu-timer-animated/solution.view/index.html b/1-js/9-prototypes/5-class-inheritance/5-menu-timer-animated/solution.view/index.html deleted file mode 100755 index 705919d8..00000000 --- a/1-js/9-prototypes/5-class-inheritance/5-menu-timer-animated/solution.view/index.html +++ /dev/null @@ -1,64 +0,0 @@ - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/1-js/9-prototypes/5-class-inheritance/5-menu-timer-animated/solution.view/menu.js b/1-js/9-prototypes/5-class-inheritance/5-menu-timer-animated/solution.view/menu.js deleted file mode 100755 index 9a91f30e..00000000 --- a/1-js/9-prototypes/5-class-inheritance/5-menu-timer-animated/solution.view/menu.js +++ /dev/null @@ -1,28 +0,0 @@ -function Menu(state) { - this._state = state || this.STATE_CLOSED; -}; - -Menu.prototype.STATE_OPEN = 1; -Menu.prototype.STATE_CLOSED = 0; - -Menu.prototype.open = function() { - this._state = this.STATE_OPEN; -}; - -Menu.prototype.close = function() { - this._state = this.STATE_CLOSED; -}; - -Menu.prototype._stateAsString = function() { - switch (this._state) { - case this.STATE_OPEN: - return 'открыто'; - - case this.STATE_CLOSED: - return 'закрыто'; - } -}; - -Menu.prototype.showState = function() { - alert(this._stateAsString()); -} \ No newline at end of file diff --git a/1-js/9-prototypes/5-class-inheritance/5-menu-timer-animated/source.view/index.html b/1-js/9-prototypes/5-class-inheritance/5-menu-timer-animated/source.view/index.html deleted file mode 100755 index 20de9758..00000000 --- a/1-js/9-prototypes/5-class-inheritance/5-menu-timer-animated/source.view/index.html +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/1-js/9-prototypes/5-class-inheritance/5-menu-timer-animated/source.view/menu.js b/1-js/9-prototypes/5-class-inheritance/5-menu-timer-animated/source.view/menu.js deleted file mode 100755 index 996329ad..00000000 --- a/1-js/9-prototypes/5-class-inheritance/5-menu-timer-animated/source.view/menu.js +++ /dev/null @@ -1,28 +0,0 @@ -function Menu(state) { - this._state = state || Menu.STATE_CLOSED; -}; - -Menu.STATE_OPEN = 1; -Menu.STATE_CLOSED = 0; - -Menu.prototype.open = function() { - this._state = Menu.STATE_OPEN; -}; - -Menu.prototype.close = function() { - this._state = Menu.STATE_CLOSED; -}; - -Menu.prototype._stateAsString = function() { - switch (this._state) { - case Menu.STATE_OPEN: - return 'открыто'; - - case Menu.STATE_CLOSED: - return 'закрыто'; - } -}; - -Menu.prototype.showState = function() { - alert(this._stateAsString()); -}; \ No newline at end of file diff --git a/1-js/9-prototypes/5-class-inheritance/5-menu-timer-animated/task.md b/1-js/9-prototypes/5-class-inheritance/5-menu-timer-animated/task.md deleted file mode 100644 index dd080260..00000000 --- a/1-js/9-prototypes/5-class-inheritance/5-menu-timer-animated/task.md +++ /dev/null @@ -1,14 +0,0 @@ -# Меню с таймером для анимации - -[importance 5] - -Есть класс `Menu`. У него может быть два состояния: открыто `STATE_OPEN` и закрыто `STATE_CLOSED`. - -Создайте наследника `AnimatingMenu`, который добавляет третье состояние `STATE_ANIMATING`. -
      -
    • При вызове `open()` состояние меняется на `STATE_ANIMATING`, а через 1 секунду, по таймеру, открытие завершается вызовом `open()` родителя.
    • -
    • Вызов `close()` при необходимости отменяет таймер анимации (назначаемый в `open`) и передаёт вызов родительскому `close`.
    • -
    • Метод `showState` для нового состояния выводит `"анимация"`, для остальных -- полагается на родителя.
    • -
    - -[edit src="source"]Исходный документ, вместе с тестом[/edit] \ No newline at end of file diff --git a/1-js/9-prototypes/5-class-inheritance/6-constructor-inherited/solution.md b/1-js/9-prototypes/5-class-inheritance/6-constructor-inherited/solution.md deleted file mode 100644 index 4339ffe9..00000000 --- a/1-js/9-prototypes/5-class-inheritance/6-constructor-inherited/solution.md +++ /dev/null @@ -1,26 +0,0 @@ -**Нет, не распознает, выведет `false`.** - -Свойство `constructor` содержится в `prototype` функции по умолчанию, интерпретатор не поддерживает его корректность. Посмотрим, чему оно равно и откуда оно будет взято в данном случае. - -Порядок поиска свойства `rabbit.constructor`, по цепочке прототипов: -
      -
    1. `rabbit` -- это пустой объект, в нём нет.
    2. -
    3. `Rabbit.prototype` -- в него при помощи `Object.create` записан пустой объект, наследующий от `Animal.prototype`. Поэтому `constructor'а` в нём также нет.
    4. -
    5. `Animal.prototype` -- у функции `Animal` свойство `prototype` никто не менял. Поэтому оно содержит `Animal.prototype.constructor == Animal`.
    6. -
    - -```js -//+ run -function Animal() {} - -function Rabbit() {} -Rabbit.prototype = Object.create(Animal.prototype); - -var rabbit = new Rabbit(); - -*!* -alert( rabbit.constructor == Rabbit ); // false -alert( rabbit.constructor == Animal ); // true -*/!* -``` - diff --git a/1-js/9-prototypes/5-class-inheritance/6-constructor-inherited/task.md b/1-js/9-prototypes/5-class-inheritance/6-constructor-inherited/task.md deleted file mode 100644 index ea7fde62..00000000 --- a/1-js/9-prototypes/5-class-inheritance/6-constructor-inherited/task.md +++ /dev/null @@ -1,19 +0,0 @@ -# Что содержит constructor? - -[importance 5] - -В коде ниже создаётся простейшая иерархия классов: `Animal -> Rabbit`. - -Что содержит свойство `rabbit.constructor`? Распознает ли проверка в `alert` объект как `Rabbit`? - -```js -function Animal() {} - -function Rabbit() {} -Rabbit.prototype = Object.create(Animal.prototype); - -var rabbit = new Rabbit(); - -alert( rabbit.constructor == Rabbit ); // что выведет? -``` - diff --git a/1-js/9-prototypes/5-class-inheritance/article.md b/1-js/9-prototypes/5-class-inheritance/article.md deleted file mode 100644 index 3aa7012c..00000000 --- a/1-js/9-prototypes/5-class-inheritance/article.md +++ /dev/null @@ -1,358 +0,0 @@ -# Наследование классов в JavaScript - -Наследование на уровне объектов в JavaScript, как мы видели, реализуется через ссылку `__proto__`. - -Теперь поговорим о наследовании на уровне классов, то есть когда объекты, создаваемые, к примеру, через `new Admin`, должны иметь все методы, которые есть у объектов, создаваемых через `new User`, и ещё какие-то свои. - -[cut] - -## Наследование Array от Object - -Для реализации наследования в наших классах мы будем использовать тот же подход, который принят внутри JavaScript. - -Взглянем на него ещё раз на примере `Array`, который наследует от `Object`: - - - -
      -
    • Методы массивов `Array` хранятся в `Array.prototype`.
    • -
    • `Array.prototype` имеет прототипом `Object.prototype`.
    • -
    - -Поэтому когда экземпляры класса `Array` хотят получить метод массива -- они берут его из своего прототипа, например `Array.prototype.slice`. - -Если же нужен метод объекта, например, `hasOwnProperty`, то его в `Array.prototype` нет, и он берётся из `Object.prototype`. - -Отличный способ "потрогать это руками" -- запустить в консоли команду `console.dir([1,2,3])`. - -Вывод в Chrome будет примерно таким: - - - -Здесь отчётливо видно, что сами данные и `length` находятся в массиве, дальше в `__proto__` идут методы для массивов `concat`, то есть `Array.prototype`, а далее -- `Object.prototype`. - -[smart header="`console.dir` для доступа к свойствам"] -Обратите внимание, я использовал именно `console.dir`, а не `console.log`, поскольку `log` зачастую выводит объект в виде строки, без доступа к свойствам. -[/smart] - -## Наследование в наших классах - -Применим тот же подход для наших классов: объявим класс `Rabbit`, который будет наследовать от `Animal`. - -Вначале создадим два этих класса по отдельности, они пока что будут совершенно независимы. - -`Animal`: - -```js -function Animal(name) { - this.name = name; - this.speed = 0; -} - -Animal.prototype.run = function(speed) { - this.speed += speed; - alert( this.name + ' бежит, скорость ' + this.speed ); -}; - -Animal.prototype.stop = function() { - this.speed = 0; - alert( this.name + ' стоит' ); -}; -``` - -`Rabbit`: - -```js -function Rabbit(name) { - this.name = name; - this.speed = 0; -} - -Rabbit.prototype.jump = function() { - this.speed++; - alert( this.name + ' прыгает' ); -}; - -var rabbit = new Rabbit('Кроль'); -``` - -Для того, чтобы наследование работало, объект `rabbit = new Rabbit` должен использовать свойства и методы из своего прототипа `Rabbit.prototype`, а если их там нет, то -- свойства и метода родителя, которые хранятся в `Animal.prototype`. - -Если ещё короче -- порядок поиска свойств и методов должен быть таким: `rabbit -> Rabbit.prototype -> Animal.prototype`, по аналогии с тем, как это сделано для объектов и массивов. - -Для этого можно поставить ссылку `__proto__` с `Rabbit.prototype` на `Animal.prototype`. - -Можно сделать это так: -```js -Rabbit.prototype.__proto__ = Animal.prototype; -``` - -Однако, прямой доступ к `__proto__` не поддерживается в IE10-, поэтому для поддержки этих браузеров мы используем функцию `Object.create`. Она либо встроена либо легко эмулируется во всех браузерах. - -Класс `Animal` остаётся без изменений, а `Rabbit.prototype` мы будем создавать с нужным прототипом, используя `Object.create`: - -```js -//+ no-beautify -function Rabbit(name) { - this.name = name; - this.speed = 0; -} - -*!* -// задаём наследование -Rabbit.prototype = Object.create(Animal.prototype); -*/!* - -// и добавим свой метод (или методы...) -Rabbit.prototype.jump = function() { ... }; -``` - -Теперь выглядеть иерархия будет так: - - - -В `prototype` по умолчанию всегда находится свойство `constructor`, указывающее на функцию-конструктор. В частности, `Rabbit.prototype.constructor == Rabbit`. Если мы рассчитываем использовать это свойство, то при замене `prototype` через `Object.create` нужно его явно сохранить: - -```js -Rabbit.prototype = Object.create(Animal.prototype); -Rabbit.prototype.constructor = Rabbit; -``` - -## Полный код наследования - -Для наглядности -- вот итоговый код с двумя классами `Animal` и `Rabbit`: - -```js -// 1. Конструктор Animal -function Animal(name) { - this.name = name; - this.speed = 0; -} - -// 1.1. Методы -- в прототип - -Animal.prototype.stop = function() { - this.speed = 0; - alert( this.name + ' стоит' ); -} - -Animal.prototype.run = function(speed) { - this.speed += speed; - alert( this.name + ' бежит, скорость ' + this.speed ); -}; - - -// 2. Конструктор Rabbit -function Rabbit(name) { - this.name = name; - this.speed = 0; -} - -// 2.1. Наследование -Rabbit.prototype = Object.create(Animal.prototype); -Rabbit.prototype.constructor = Rabbit; - -// 2.2. Методы Rabbit -Rabbit.prototype.jump = function() { - this.speed++; - alert( this.name + ' прыгает, скорость ' + this.speed ); -} -``` - -Как видно, наследование задаётся всего одной строчкой, поставленной в правильном месте. - -Обратим внимание: `Rabbit.prototype = Object.create(proto)` присваивается сразу после объявления конструктора, иначе он перезатрёт уже записанные в прототип методы. - -[warn header="Неправильный вариант: `Rabbit.prototype = new Animal`"] - -В некоторых устаревших руководствах предлагают вместо `Object.create(Animal.prototype)` записывать в прототип `new Animal`, вот так: - -```js -// вместо Rabbit.prototype = Object.create(Animal.prototype) -Rabbit.prototype = new Animal(); -``` - - -Частично, он рабочий, поскольку иерархия прототипов будет такая же, ведь `new Animal` -- это объект с прототипом `Animal.prototype`, как и `Object.create(Animal.prototype)`. Они в этом плане идентичны. - -Но у этого подхода важный недостаток. Как правило мы не хотим создавать `Animal`, а хотим только унаследовать его методы! - -Более того, на практике создание объекта может требовать обязательных аргументов, влиять на страницу в браузере, делать запросы к серверу и что-то ещё, чего мы хотели бы избежать. Поэтому рекомендуется использовать вариант с `Object.create`. -[/warn] - -## Вызов конструктора родителя - -Посмотрим внимательно на конструкторы `Animal` и `Rabbit` из примеров выше: - -```js -function Animal(name) { - this.name = name; - this.speed = 0; -} - -function Rabbit(name) { - this.name = name; - this.speed = 0; -} -``` - -Как видно, объект `Rabbit` не добавляет никакой особенной логики при создании, которой не было в `Animal`. - -Чтобы упростить поддержку кода, имеет смысл не дублировать код конструктора `Animal`, а напрямую вызвать его: - -```js -function Rabbit(name) { - Animal.apply(this, arguments); -} -``` - -Такой вызов запустит функцию `Animal` в контексте текущего объекта, со всеми аргументами, она выполнится и запишет в `this` всё, что нужно. - -Здесь можно было бы использовать и `Animal.call(this, name)`, но `apply` надёжнее, так как работает с любым количеством аргументов. - -## Переопределение метода - -Итак, `Rabbit` наследует `Animal`. Теперь если какого-то метода нет в `Rabbit.prototype` -- он будет взят из `Animal.prototype`. - -В `Rabbit` может понадобиться задать какие-то методы, которые у родителя уже есть. Например, кролики бегают не так, как остальные животные, поэтому переопределим метод `run()`: - -```js -Rabbit.prototype.run = function(speed) { - this.speed++; - this.jump(); -}; -``` - -Вызов `rabbit.run()` теперь будет брать `run` из своего прототипа: - - - - -### Вызов метода родителя внутри своего - -Более частая ситуация -- когда мы хотим не просто заменить метод на свой, а взять метод родителя и расширить его. Скажем, кролик бежит так же, как и другие звери, но время от времени подпрыгивает. - -Для вызова метода родителя можно обратиться к нему напрямую, взяв из прототипа: - -```js -//+ run - Rabbit.prototype.run = function() { -*!* - // вызвать метод родителя, передав ему текущие аргументы - Animal.prototype.run.apply(this, arguments); -*/!* - this.jump(); - } -``` - -Обратите внимание на вызов через `apply` и явное указание контекста. - -Если вызвать просто `Animal.prototype.run()`, то в качестве `this` функция `run` получит `Animal.prototype`, а это неверно, нужен текущий объект. - - -## Итого - -
      -
    • Для наследования нужно, чтобы "склад методов потомка" (`Child.prototype`) наследовал от "склада метода родителей" (`Parent.prototype`). - -Это можно сделать при помощи `Object.create`: - -Код: - -```js -Rabbit.prototype = Object.create(Animal.prototype); -``` - -
    • -
    • Для того, чтобы наследник создавался так же, как и родитель, он вызывает конструктор родителя в своём контексте, используя `apply(this, arguments)`, вот так: - -```js -function Rabbit(...) { - Animal.apply(this, arguments); -} -``` - -
    • -
    • При переопределении метода родителя в потомке, к исходному методу можно обратиться, взяв его напрямую из прототипа: - -```js -Rabbit.prototype.run = function() { - var result = Animal.prototype.run.apply(this, ...); - // result -- результат вызова метода родителя -} -``` - -
    • -
    - -Структура наследования полностью: - -```js -//+ run -*!* -// --------- Класс-Родитель ------------ -*/!* -// Конструктор родителя пишет свойства конкретного объекта -function Animal(name) { - this.name = name; - this.speed = 0; -} - -// Методы хранятся в прототипе -Animal.prototype.run = function() { - alert(this.name + " бежит!") -} - -*!* -// --------- Класс-потомок ----------- -*/!* -// Конструктор потомка -function Rabbit(name) { - Animal.apply(this, arguments); -} - -// Унаследовать -*!* -Rabbit.prototype = Object.create(Animal.prototype); -*/!* - -// Желательно и constructor сохранить -Rabbit.prototype.constructor = Rabbit; - -// Методы потомка -Rabbit.prototype.run = function() { - // Вызов метода родителя внутри своего - Animal.prototype.run.apply(this); - alert( this.name + " подпрыгивает!" ); -}; - -// Готово, можно создавать объекты -var rabbit = new Rabbit('Кроль'); -rabbit.run(); -``` - -Такое наследование лучше функционального стиля, так как не дублирует методы в каждом объекте. - -Кроме того, есть ещё неявное, но очень важное архитектурное отличие. - -Зачастую вызов конструктора имеет какие-то побочные эффекты, например влияет на документ. Если конструктор родителя имеет какое-то поведение, которое нужно переопределить в потомке, то в функциональном стиле это невозможно. - -Иначе говоря, в функциональном стиле в процессе создания `Rabbit` нужно обязательно вызывать `Animal.apply(this, arguments)`, чтобы получить методы родителя -- и если этот `Animal.apply` кроме добавления методов говорит: "Му-у-у!", то это проблема: - -```js -function Animal() { - this.walk = function() { - alert('walk') - }; - alert( 'Му-у-у!' ); -} - -function Rabbit() { - Animal.apply(this, arguments); // как избавиться от мычания, но получить walk? -} -``` - -...Которой нет в прототипном подходе, потому что в процессе создания `new Rabbit` мы вовсе не обязаны вызывать конструктор родителя. Ведь методы находятся в прототипе. - -Поэтому прототипный подход стоит предпочитать функциональному как более быстрый и универсальный. А что касается красоты синтаксиса -- она сильно лучше в новом стандарте ES6, которым можно пользоваться уже сейчас, если взять транслятор [babeljs](https://babeljs.io/). - diff --git a/1-js/9-prototypes/5-class-inheritance/class-inheritance-array-object.png b/1-js/9-prototypes/5-class-inheritance/class-inheritance-array-object.png deleted file mode 100644 index 5de99e36205434844903515996a6d63dbd04b870..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17917 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 diff --git a/1-js/9-prototypes/5-class-inheritance/class-inheritance-array-object@2x.png b/1-js/9-prototypes/5-class-inheritance/class-inheritance-array-object@2x.png deleted file mode 100644 index 31e5da8ec7b2cdf73424e262a4a4c14e60c3f168..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40174 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 TT0RfC0DR!uhFVn`50U=`xvx=) diff --git a/1-js/9-prototypes/5-class-inheritance/class-inheritance-rabbit-animal.png b/1-js/9-prototypes/5-class-inheritance/class-inheritance-rabbit-animal.png deleted file mode 100644 index d242a125304ef8b34de8408a3f5581a65b60d3b2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20052 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 diff --git a/1-js/9-prototypes/5-class-inheritance/class-inheritance-rabbit-run-animal.png b/1-js/9-prototypes/5-class-inheritance/class-inheritance-rabbit-run-animal.png deleted file mode 100644 index 3f479cecda4b368521a88228279f3427222fe302..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21983 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�h!80B^P7Xmj>(VjLF*v8tIg1t@giI!=KzZ$WRKwj`D69(4DF z!;NuTJ2vqcR9`B{b$u7la3DpP^Zi-W(gv;vmmy%HryToPDLI*R`sEV9-6&8KUr>XC zb(-JEiAym==WM*|jo=_HQ zA3GxoVl)tgnvzcn=$fIqWYm1l0dHLYE87Aa&~TDKK1JP&*!CR_j-Bbk4_hIq>g=% zHynPV3JsAfQRVv1sK(1Z@AUDkx-g}58~m{aMeHj?Kyd<|5CIk(CK90gW6HfRum(K$ zYMox92Qsev721(hp_7`ti%v%tetwP|rhZi7ge?#wJk%?sclv{3XE#Wm_yx>&s^ob4 zx$c-kFcvd}a~(NUdSsZEyiO>Dz$!v(%|DEXBAk~lAb&pekgj|*?KYFErv)7zryYEBe8gqgDIdNVuIG~;46%})|0!X|H_S)d z;0OT0A@;A_IFQOr{HM`&hh)bWrD4HZPjvuoy8qa?@L^B?8#SjpF;2dcgpjZAbsVEx zXa?~#{CH&K-3%g3^=Z?(D6+Mir&`3CAP@j;?-gKXLu~gNoSlWt!6C@Y*CW*E51? zMkydULF10D`GFBRAJK<-i~2s0D49byU?r)1argj(P%|ObxdrhvUIM^cG?IB-bF z7e{i)olrRgG4yN2MSM~$k;4DxcVP+Ol&mB_l;vK2Ms(jSG{T0N`JF|6fkP=bv^9AR z4;G`9+0_JXd|b@$2R^hSs;TPPhY)feXE~QTeM^4s_gXP#m6I)!fv9)hZ422_@oMOO zI#5d|sOK8ahWwnna^<=wmdYi78vIhz)o;!7LrWpu50=k%76aJS5vlqJaR14)caXd- z3HxSD^urg^<3kW>p?OGBMQPl7S}A2uFeszIt&RI}LZm9Nx16@5pHA{7dv6@(mjrB6 z!S)JTS_r0h{giKJzC~=?vk;+tv<(DM54J_a$4`mShqqu>Na4uR7ss!hCvaIL;xCfD`+Ob)b~mx zUOBQd#pYc-bz%A!BWsP;!o78i-M|H#E^W8K{$xHA6TZsmAZRLUtLB4k)4^{F%GtPO zLjP;PM=;eMhy; zZZ5GtJT?W5S^U!G8iu&2Q+ceP=;v)RB*kfDOa^uFE8fe5uw2i_P&3v?NZw3Z5>~Iw)>9kAq;LE#3)5 zj^HkMr|%M4kGItF35u@&oZtwJtG16W4*ge6{(Wj=8BN_bcVoR5>47i|4_>VBQDV!L zJ215l7c4aWOL4nL{Cj#g(G7xd~>EU_(RW>aR1c@ zl=sxfwwcTdCAk}0#>o=lzF*s%6P)TSb_PZIlf1a5@1X)yt zs61g0(U5j(RL)cYf{f2Wm_)-H+U6BDY8(d#ep=nKh%s5k<9`Nl~nv-xH5UG`?ELnT^K&4K>-pkKiQ z5@zHk(Qt@L#BCK@o)|^CP^`;_5SmS`WOx23btJ?Ne}}G~){lvnv;&MxoBL`@0_>5R zD!ms5T@^*^=5EHrRpZC7uBNlgdeJGEt+j^`>M^IlNn_*R{Y^s99?O;2U2H0zIUF0N zP0u(YpX-nCB1OXcM4&7hR2pyVgJ1=M8g9ua`o|%-X=3i&=NrC*y_GJ>q~SU2*EGSiXb5)i?Kf*Pz$D{t+EVVDz}l5IG=Vz_I z_*ExWj~b+84Oa6-6PNZS;3UG20SBr9{7S-b0D= z-izal<`xi5*H{!RLzAd>Ec~d>b60>+hu~I~7t(_h%>^d`Miqj0qL(WE?^hmB3jqG9 zmx47n(LXKTwsan~GwoM*=v4kF*l_F%qwYzu!{7G{$oEGI-ES=zGQ@>dD4_hxPIK>y0$J)&5r}(?oG&b-o?tE`$Hup z__`Fysio5SK96($UwM{^;mP@YC`T@QVOh)GV4#T}jTFtwE=$1NHS912N^N0X{Kqq# zs6&-Lto1XvzKKID|E_Qj-CHptVdnJf+;^~UW zenj|N6vWUM1Nv-!Dlkuo)}**?CokTvD}=seWt@B%WQf+NICNf?U3#889l{Sw3Io)s zm;&!`pw~ZNgq{_i&Dwf_SPd*47VKO^0GpUl{j$1C`m3)n&)#XEOMrSh0u0Pr{;7XER`Jh3s)%t@yH*Kz(e zJoxnaB;<;3p-z6Ar~E8^37ZmS!b4{u*DcXUI+pph+7p#g_SFFe+Z<^546Lo&8qsnKh=hFXry2@PpL_EL7x4X%J7pDCb0Iwt%3i78c zQR@1fRo{`X)UD3aDLfpg{CA-X(m8{Fuad z=Q6P>?1!Uv84`Is9CqYf#QEEPL@bO}Z`VjRWC+KD zp?U?qZj+=$RH2R@+w;bv1@hbLd>NRZuYJ|pa~Pr#fQ(ODqVa)KSy3X<-kyiO!Ii4aHC5k#}h;!%Y^T^mxhXiI1~$il(IWT~rW z%9e2t3?L4Rr;>?*gW&TGq+pt2`9x)!U^=nyIj>tUkV`ed2QzIGB@L;I zW>cm@z#t3F;AKfFdZRyAa(g@#jmi;NgC*VEs-O456XpIBv_O2J_U(6uHxj0=4DQY| z6!g%Rw@xLb7b@Zg|3$gztx=Eo$G{>7rL+dCF#_mng1T_g#O^XSOi9c~S{b(+d!Jh2 zgo77Tj@A*_tk&}ANu}s1+8v(<9ZeZ3ZOQ9_6&21f%_RQ|_HGa+S_><9@8Q88osCB2 zMA*go3jsA{uZAmBofQO4++bX?=^xA>A_0pt@K;!%^mP}z`z}-~#fDlp5a2a+!+qJlRvdNVpuryyt}qIuJAQ&4=%AKg zRZTG5*SvLwoGaD~9^g&|w)j;UB7DaYN7*I@Mg>Ac-79|0)WE2I9BS5Rl5SyN99Sgy zlOh=PuPTg9*$hwAHw1(Yl>lpA8l^h;tFkPa<_rfx`dajO8B0<~^bx+QMTI2XSWcIa8$tJb5ZxY4dgODEtGFZg z`6r*(ieC$llFr$>GfbU$P1W^c%H(Re$SWB%uGH+JbU?eIlIPpAj=Efp`|iECYx@hY zXW}YCwPLQYAi2!B=-B;_Yswsx|EKqdL|mZS;G-`5n0D)VqyWR{?-VM!)E#m^&NBEP zky)0{q>Qs$7rrX3O!4cP(qG%Bs+L!2pH<7K&&K05g?w0ZH5YJwgyUS#Go+$|XujKt z=8Mg4orqeM2YSxbU4*kT9LqQLSA9;Xzx-|q?hYB36=+TnGZy+ zt|pW}Dg}fmbZ?=OuRm^1dqn-t1||jrwxVe%m>pfk0gu8Su1U#?&zkGGIEuGlX;tb%#8?bPpuX5Fi#bw; zlTE2MK>k1`QIu5dYOpfh8jwznIl_Me-@`T=9QS&hhWLuXiN%8 z6MjvfgvmeBJ7a6KG>9PyuBK~6x>8-G%Xmpv&HV4jU*E8~QV}{3(YqjgG%oKu_4{ahyZ*V7t z0&|XwlzyGz?qMn6oBL_}3%25yKEf|i{9_1uJ@tVa^ zW`SvUXV0&43)SV|!jLE4!TpZeBF7hscJ@CY1v&RdcR8fEHE&}kPfRAIg+41uiF3-8 zw*pw%q|=6?opHYCh14bN2eoR|?C@)su$8nnW1*z3vmF+VsFZKp6^|()5pznesRg%DpPu$gs=>6G>9hO72atYBJLjrzJFlW_G(}k&OY8wIHxDRIl}i8}A4=2isI(*CY0Pj+ zj+=n`$S2S`OhhJYSGS4#p?I7+-sgp4M+>JEhtlK8?BFbbbVa)GTJ3FlN7P#7*$D)p zz53kAmxxv>1;_pKd$0WZ4Uf30+vM{@DTrk<=?B7zN{W6i)<**Fg8UZ@5czQ&IuCFN z;107qBX_3f!xkE4oW|Aq3{m}PPAi;gcB|n=%T8LUxhQ;uaagdyZg``7owJOtn&f!EdTO_+g?vi6#wkzl9x=K#}ZQ;*% z`>BfB5Y5#8$P~Jgmt&Z$3-(d}%_V%qQgT>*H__hOp;aV9d6rEoyYQra=;v;J&GwMb zd~$Fb=J7Z@BYp~kM}HeOk^5|b0WFAQ1fxQv8fG*~+l9`96O|D0r!5P!S=wnUdt`1(=U6;*wv_Cum91?d?;_r_75}0LSd;kR%dw!Wn)Ll^C|gAxKAGdW;luH61f2YZXm9UMj2 z%u*}7%g@f;-riK5<<(O`hpzA}=~&5EbwU$5alQL{$Eux}L_cMB_LPiz=#U}&gQMQF z43Bld38!Dp0@*cvSh4+j75G5+C;QV(hNd$DPAvCaey@G+750D72jZm@tQE8XT!*wZxH@2 zIbF&^FD)G@@ahg!GTPT96llrCKr7CM3A1Z)VqB3`#2-?*`G=Zmd;SvTmUAP+hcLSEbnNsXo1#{*(TMfU12=JkgUa25!bWifu zue01xz{*$P{%O8*!~xF~{3)X`W2J~#+gf*dTQa@Vrj`sw+2hrt(Fk2$@nZP`-!^XIz}#Z_#@hcJN-rfJXLq&gmE9br*;5UCL3aL<8$;=fFGPj0%4(!X${8O zbgGR=(OFYhfnN@d*9>plHRFl_*eVB*lA^}2S$!LMOj_MNlSO*?K8e-(#>q3Nc6Z{@ zqN=afDIn^+JAD`uuI;oyAJLb_fA0aGLQHDUOlNo~0`}$wOl$fbPZNIIm+)W_+xYG& zcoWn-#^KGScn1(CmCsVf5YHxkAAlZCa5QvL86_C5COsV8m)2F(u`1k6j4k?G-H#o@ zSl|g+gD3FW@)5*gl*oMO^*J_k`3!dN@?{SI5vVsz#kZWD@&wswk{Dq0==0w73us}g#(~)95;o>p&A&e;(c|!fv}mdF_fXjlU~TgJLl%YIk?I zj%>fT{rHmXrpK~KZ$941IOsRoTg47pnTT~<<(Dhq3@ir^JB>N6h#M+0kLLgK31WY5 zwgsAO+zupvm@l}h>|UqsWsEm3P!v4fB`1EnwRwCTSgI&{(J}^P!9vvBm@xb@x2A0( zS<-N-qWlqksiB3>OQz0GZzl-P^K18XQ)6s^0sL!k<6n&6KWxzeZ&A9Z+(Ck1FB>gH z|2(fK$b|zBMSb5>m)#bM)0H4r2|**swsjx*Hb1y#@hHKvAp8Uvym~C8JmTeUdP~xq z{&}WuLh?v=q!9cHI4InHC{L_?J$uKmh44+ZBoKXVLM60QmL8l7Z!boPRDo9PgLbZ| zr6=!2x~r+F_)A&-RWOt`ZXmAe3^<+(7Co)cr%m?N(uVUw^t^q+jYa5TwA2CIp){%Y zT1&=ypP+Htz2#F~Znv!IE82PFNX`Q7xi3~9;lYqvs4Tz98?1X=4frHDkOt) zi7pWRx((vbzSnf~BHJ^0hm`Yr`(g4;FEv}ciYUZhY0#JAPua!b-)j2PCWE?o9JB8H)9*! z?ctNE9)}cvMk27^Q-t7f0)*0efI>AP162&=(jTwco6|#Cef>Bl@5n5t!OIGaQRZ-d zs#ua_nQL#{g;!O3Nix2No0*`|sTtJ&@&-_iJ@dbNvnw)s2t!y=e(m)f9#JeLI-{z! zHw@Wv!SU=}j|F&1s7YNxS|;LQLdfYLp$N~|Mbe)RlZQr6K|fbZsI!uVM%di_sh|#q z%k(z8xzXqx?FFM8u)1?~*&LVyzl%DK60TWKINj+cgB*r@cFhWyx%WX$=I2|T#xir< zUiPpgY6&FWb)1$)4qMXkY;`O9GkzSx(Jeh`~ZU`}2(4icD-?Fa1?{L3j*$FOL1i`U6jpzb5 zVC{A{IEePUQ7G|W(3`PErT%MrL-B{{_p$iJOoJWKjB>}$cyyB8V5$`}PQ4zQ`?sI2 zE2TvEXEhG=+3d(Ro*k&s6z}k&t20&%?&ob$<$e%i?NEP(U;R5-al`LAs)2}CXX!CD z3M19HG_6}__l(zan2i)D@q@mc_AtC%h;Gyg20S;(v+WPKOws_iL15@a7zL!fZ^rFyqzaLQgj-nRleUnm9c-?5gzvwi8X#J58|{b zqejjRQ7^nn)B;G$9=Wp;DEs!!)#@8N!N=zniswd zA9>Ts1X#(BzsT_N_{$udb=WxH#%>m;R=fKm*gA=k2*?Y|c8sKEIjK3v1Gjfpa2Yrc z?k{-l=hqw{Y~Fb!19+pVR-PQL3FzDZjLjam-~`X`R)t9#mxhC+VNU(sxKQj4Vy){7 z^H8}6XZ5@+ zMr4y!jC*ILj6)i%?1f7Ol@-X_Y8~uxROs;-74Vavt^|R8Nyx7nPIY?@bd*}e|8o+A z>FL&&@J|$^nBU-D=d5>x^oV!@S|gd$n{BId)ji#rJJJfblK-mTYxh^`d*g?3eJbiZ z0>n5RxTG^Ij2D!D6%9^cBl>LBp`Tnxu>ACYlnM;%LHK>obGX}Gatu90@@#;!jew3a z4*1Rt_^PKlH*YE~k!Sn)EgXo|ZVB2DEW@ol#`;gmX4f61&`#gmh#zx3w}R z1DG`k#oA)ZGc^?^lDlfv3^TF)G3iX<>Ih6)goFir-fGdpf^4kfCp zTAqT<8@9T|MO%zEk344PA3C!VrFAjAvnpQ1o<@v;pFGHegw5-U+L{A;I`L4F&-?6i zCjC|Z_O?*nH!SAtZj^a{iKih=hsmy1HjB4Q=SW-~545i^Rdyf0z2PifRN_2Xdw@J3 z@WT}s-*g3Lur#J%cTP#P#L$?a-aG3-nnjW1WEC8AtaYUvuXN}1F{GCx zJ`Fj41$t!gUCFh6VQT7gL*^} zD+boNI5PIFfKc#({vh+L&$&NH)hMeTzg7-kQ@7gf@7g3FlPfuV#|sPRT5K>WW_Fp_ z=V`V12_^ga)hhvH^9$d0m|8g>6nosO@YQ!!)+_}J11nx)g!X9A7^4ACJdssBgAbmV zo@#70{T&d<66fYiRsTLJFLw2l86bq%T}T5%J6uoyB$*%y+vorKTDN~s_y%A8 z!3MYa@=l#7-;uL#4#y&$#yX!2vs|($YwYJC?hcK>TpvG7?LY{Lt4AZ@4+9a5Tz#w&!NHhsRs5?eTi| z%Dm&Tt5{L6e;2)hXf~*Blnqx+q6wYxf&z+sac&PeuOzqp6jS#emIoK}nmMA$B6FdA zQzWn~Sj(!iLHoY4D!_i-xcvSkK0}|teCe>^J2~2;u>_5|nM0%E)nA0~HQC;S`jS)> zb;y&te6ao|=id{B^c2m@P>DlW*u8^!eR}lB+7I{NI$18eUd{fv+zJ4mM)e1Klb~>geXw{s-?0{I^MKqo30MZqF{kSlEv#(yj%T46 z^fdmA?ae4t|7~U-( z3G~#21L*LR_z}BXJE2h(V=AHLBg<-|o zXB7vSKU;B`Z$WRbcz^ohV;*)FMKq7H?t(YJ&Y}{uB_u84hUoFiirna)K{VAuqW#i^ zx)1&Wh4_OpL!+3l^zE&;I@Pz@uyq%27!Tj=g>iaK383PUeNvCG7%^SsXL?I7m%4Ft zI;4j=$zMQBa6F#~tJK`@ps_kg@m%myhX>&@*}IX5o7W>~Oc^dXsxk+%GQjPJXFQI6 zJe{Cun;?2YZjLhqaM08Hi7p|44aIQ5F~GZUKqyoN^JSBnh>5+JK|@qiv3=rck4+^k zFG@tM2@dZ=E6!nUu~(_U*=$YMpc$6UFN)`{TUhzy?OsC_{S?aA4-?(~((=dzO++80MqDQEQ1GNbtt$Mdf!pjINym?75%qU-kJvSf% zP<$9~x=+gX8}6rYAmX;gF9f2O8QWamB=pLP0xuU?)0mfBo!_1jk`e;!1e zwD$8WZJYh6OGYQ*@s+U^cElDrw84K}w{^U%5Yn6hf|i}w9=COshJ`wXWEvYKmrv5v z(^A>=KTpg4myL%CkzBK#qvHx0sRU(7`KXg@=|ZCp#T3Ic?MC--Nz@t|9+7_#v3$@nJ177s*WrwlOIYC`9bBMfrGE zZyQbh(e#hy*n2ep6}Q$dOYf!{T1ExrLkGo$aiSr;KAJJ2C4~O}%zgB_3%FT&z5=qR z&41>?EDPmo-2q&L!WQx{pr!tQU>}=JGMaDSy+>0i+MgvSoIos{dbJ3;dQ{#g^1Dl$ z$p{YWBXcC1wFzuFhe+x% zeM(9rjOL z{b?C_m(>phf1ez86(VHD3uhjI8H32e!jNwxiv%H3aAC}H)%)wTs2}?|^5PL^&XU!^ z2J=3;dd1acqv-8+H-NmblydoYs$c8H)Kywiy&}5VZE9549s`3VOxoff5>F<*i$D|{ zNE!Y|2-rtN1eN3vIgx;P5PTOD5zT|IzXicpVK_!WI`97$`O#e>xzENOrF+>+dH334 z$Ej*^Xl;5y4AnjB4%g_&dV|i@LIHC0{6qCUX=MaWqmz-v5$Tb?Tu?(6NQx`^HQN+i z)ze*wEw??IG)-94K0%~4(X`O`LNIfLjwD~E{jaKej79g)2w zoq$IM%;PkYSlhz`EL{|l+i!O(%n-w_zO61Iz%dDQV-@M#Z?&I}pITkp+!(_IQDaur z(j)kfw84q}t|kLd_}>$HRT+ok)tG-4!Rh3>RQ%NBnXbYiEW-QT7LQM~?A#5~13=wt zCT1fsZNEjCHl8Rf>;LE!&M8gYdY}Q6F26wiq>2dsf(0I5V4z+Dj|Uv|en!Aig<{I& zDZE~zlHtJdn-0+Zo0i5#gPE6qr)kyCpDO;4&RdyuqTp@=E8+se?N^2*DJH4=u zwd8Q-p7hoC!|>873|+%RJOi+-)8(*_BD37m1Z-?GqHDM?detkNUQ%t%mqM6j5#QI? zVLiCU5zmM~y-m-D=aT`_F`FOo&zm!5M!`-Q(klRKqdTpI3ZBB^z6!C;TJMc|3H>vR z^4eu42mQNd4#oLc`VzA8%l`W{X4HxKt+osO? z?vN5yyCVB*0rfUSi zO~h&q|IQwAbYPh{%1@Os1hW(`@}V!N8>m+3p|?C2iQkPXA-QS&ZF4aW%4u-@LMCSN z5Ub-7sk8prHmIR>rB>)hhv9*7A1=`4vr%z-caZk(OPUourXO8~(t8O^L-EYxO!ML> zPaeqI*s!Gfl>!5sYv^BZQ~12!w)B(v0CV$Vo2_iWjB~Uo;z;Nc*3EABpZ8h}n=hR~ zy2tSDFMOwbzTeIVK3v7bJ@h}RGkEYCP$QmaxIxa*Fm=TB^V@}zk#zLqKGJkX|Cch( zGOnq=;ltz@gV80@EhVLdqZ<^YC8UuOn4olQG)StHz?g&}jUbF3DM*)u2n-bg5r%|= z5%>6i?&rCmc(+$)=kqyl&hK2;^<6%VDV)i`Ij4=U+>1Nadw%ei!~_0)#BO!7zf>X< z3OUrjy7{~9Fo!!hYozybkUSF&4gQn2*CYQt$>7TId(zl$xBnVbm`Cu}8-vBa1lp<9 z)`wh44v^=Xl{9?(X$w@nYAt`x<$E7aN1ecnnp(`S-TC?33}al7zTb5x)Ll{+pA&VI z0xNSbZpDr$+&%bC(&6sssrWYCeXo37TYjso9hM)PC^M^xHm}QTGIXJ=>3Hk4u@3d* z&T&(%XJyj+<7Kx-&Hthpe)#Wsf|2F{U~*6G@;%cLn!4L(`>CwL9>cLVQG4att#cS{ zvZam&buA&Yf&u$_q5q>3;LCRX18Tzg%#|_@d7>~WLM5hjcc-DgBcHirNm+aYg@hBb zW6>hL2~oX^*Vi{q%xMHpA6pSneJWVBk9~luL<}(WF+Bh8W54^J0>ugsZ(5Hfi`^W{ zT>CBeZ&a_PDaRoFEII7!_QEgdKd3(Gf1&yqy4p^`!qpz+?Xzn-H_yL|%j*ugkst4+5vD z9v}SXw|U6*K@j#bkbL%r(2>OiT3~0}YLBXXa88xDjWCgLr$J=uoF+%#rt6i_rD)Le&R>GhtaQ-l7pjyl#+ROiT+)IGblGoCAHz&N8lc%Xp!Ag9wROx-s&FwkQ zZl&mz^xu?$_LiC|{6RfS`Bm9rQu9HIKDL*3r2&Krouc#UbG-?d&09M>_|ZcXPpiPN zj-)Nh%kD=b<=BI1W>#7uC+1pzAG~oT^m#0gUn~VYI}w z0Xnl`+*LQr;_eq(Uk4qW{PA%Sp*vNz_rnJM@Z^GNE=lt$lAf|?7pHMQ&0v;|w3pP> zi8S=(Ji9VQNIF~$Hfr8|-yEkkUaC@GIzAvDW?h$D#r@EmddZPW@Q^t{@NSn8U?+d2 zW~YB8_5ZJf{|DClPdnTuLxTH#9Vvx*m@f=!_s4h=yv#9mbW=}*;^?aczDZ7cDPO1@ zQ|Ej{dXO%)N8Sw*OM2YFH0xu?Z~f|CO@fvDh;VAiZ9u9d!z`|Jy|_3XQ?gOQ`9a!6 zJ%Wk2>PpuGQKgmwa|zY3^I-I;2;mBZU(77*`t(x#li(CB+E9s$OqpLt$boL7Z-hL) zxkKhD`;Ydt;)g4G=35DvuX7XVMR7qUgdOQ#XER_rE1tE&ibd1X3s7-4ums+F=$(;e z6^dW2zYRX_xS;O9Z-rD0on}h(4V%w2Tz;u@ke^15Tu=JZ{_4H@uCuStu1Vs`2O9r{ zU&lo6(|qD@20o6*(LO4q zIH`YfrTXq?+SA~5K{1_jD+1!%FS>7CLYnlPq@$x#ZFE{Lw;A9%9x5^<4(B3`R%vTl-U7!i5S1yJpSlyomW1>);qHqHvAD>g2V8L7{49QTN_Olz(ts?=8Qxo1jjofm>+y@51_r8n5c zS2tOZXXKkj%Ma@HbQ%+(hFdu(3tx54D!9sEN0vL#nXm5E#X9#741DR+K)|Uk2`?+W z^lEL%vYxZ6JGUB4jPd-F5Pp-lyNk3p%B0gQ?zfp#b!qbB|*A=ig5~e2nqN8yBAFkP+ z@aOX=sc?Vq<8zu~I!<=t>h`Hy2x5v=cBSNo4Ee!yvT2?r!@CGp!bdVB6 zMX+B${J%TpuGYt0jZXUqF0f^@?664rojV1N>%s`$gH^aR+&3Oo=_-!@xbfaa-0IQX z7~4YoFE*{}MKFBBnSHw9GHy+E-vnxYNYwE6JYFWaL4N8_aK+y}HDpMigq+~9axt8` zu$|uCzJ;9xDw6S}aS~agK*YD9(|dO75epKp2Ry*kG=h^$|;lvas&%V zIa5+Uq0qxC)7s8*;3DVMo1-PsO_|>Jn^A!EE(LN?E)oX$zKExiM)ACi>9Z)SP2x9< zy}W1(pd`Em1D{%Wxo_%d3r<+QBoZy?T^n{6exFsuPhfpT%IrYuPzIK2Je?5Zd1F_! zScrm(SUcJ38~B1tE6Z7!ym)FjWjNhSvG(FO3nFS38RP6j_vH%8#Iozzl2MQJUDN;K zj{ua%&Yug(Na7RvRHKu6GG*?%jyM+P3^ogsjL9<0!VbxZ&F1?^d$@R*{*n_wS4C$g zN&HBN;H0nuQB&&;=+UQ}_lpNXu(T>V0iT80q&25H9Rk>s4d+R$M=bK^i~eF@f)Op_ zk71%Ro|2!{i|&LHnPm|eQqiA%4nomYi)Y(Nk*1DIJhKe~C?|2Wrr$*E>l#!;i~ZO} z3vaO}MEL_lMWQ>uquO*xnH8<*85Qs5O4Hj(6)q@~2~BV%oq66LeDy_!uzM zEI)dqvbGn|(yWn`>9vY{_LP*C!)?o}VOpPQ!A73LE~h_=8oz$xb+}IPp!>nH8k7`~ zt({@o+KYCI;63TJUkLhCj-Y3V;2b>=DhPt|mvm2?)eGN$a7d=1t9v_)X0}_#wBGN@ ztuo=(xgdb-9J**eUEOP18l~bXF`g8@-8hBy(Sn5)jhVw8TJ^=eq1Hc-OW;FJ%Z7VB z%7}$(uex5{suq9OV|^84DENctK-Nck$Y0HZBB(`%?plY!lZmzyVUe>_`GVO1NKJ^0 z3`#bf_fRy1+=#=0qCC7AQ_#Dp@j`!ZJwJH3s^^HBgA9tHX3E*-g}u7=)#2LW&J64Y z;C-Ya1$@SJQ-3h1!#>lE?-Gi-wYwEJnUE?HM>^sFKP0at%vv)$ z;W>q}uPK~_S>HLh2C|LoQ*5wFNXmoy> zmEC+$ZhYab=L>FDig;o)Rj)%R7foav=Xlfy;_>S*Q7NHd4U(~(kA_eS5D&KvxJNM5t1n2t8UZDdoBK}Z`Ua{-*erZG;jd`H~SQS(!4eGXs(9UDS5)FWViFXHJO&i#V>sXYza~1c8YB9qvho@9cB_q!L_&ta|HV!D7BXY~wQQl~m>)m9 zA+p5-jRFrQAP`QZf*A8BFKkS)10AAfjlWFYM#(T>cZ&+K%c6Bw`xzI);NM(=ybIPS z4Dkj!v^9%UfJC(?DV}-lzVLcxK<&*#Okd@+4UH1%de42ls|rvZ1efE>achAAQH`mk zm^@n8a4-uW@K>AY0Wj=#bh=o+g&wMUZbJi zC2|oYzI@wht}|v#jzRE@;~tGRIPT+RCmkd%v_i59o$jH7P06AXh~Zg}b4LcbafG+= zvyUSTW6;CrnC&22o`>JSj1Kl-UIdXEYLcPT7>CGg^fF37v*=e!Gu0FwLX>Q@;BedLxctyBI})`E)S!L^A;00GiqP2zrl4 z#w2udE`qOmbD%2wbR1~a46>f@toAUTpjuM{BIBXgocmT7dvQ13@1D@yGDX1DmnXq} z0jRMlruWYfT7AB9wYRu+7+%lhGBk26b2)o{$o>xC1)IM-3AG?uj*XPMh|9rn`6-r0 zKL5G4uaNcO_Ze7gGSL?ft6`t7$7>@Xu&?-zV5hD>jR=sNetL{91wlLuDl__Rm+n@T=!;h>Xxc<4zp$J0=0ER*s26nE|Etr8mO>f416i+VPK3 zAcy|zsNwB-YB>hj;KWN5xR6G33MYxUU=ovBnUoQymceTAT&4)LMt+og(t?^!m>E4a z+qq6NBh0LM80CV&1~xg$ZLYoZc8a|jwd|oRk@{N&SnvIQnfCc@!c(uCgIOm06vcY+ zUMx~DbIF`SKN?Gg3@>F3*tX3kjcwa@8r#Nu+W&LkG4A*0%l&l5+DlVw z%{}LD?h~dUCxHlu0|x>Ef+z_PRRRG4jRye%bAy2bK9O%Q2>||pIx0yBgH%o89fN=f zf=G%AsknijWkGvksD5<&){(cZ+(ALWkUPctp(+=85&x`Mb~N+Df|nZt^QdwXRYYWaUVE zMO}6(Hd-kS*uD}O>*1&4a*l-W=e4{UwTpkyYI8XahIG?#az&Ual3}@2CZ6;n)a@1yYy^%|2vqd#*LZCW&;X+-`sl({rK(AmmaukR8x zL-v)V>fkxT!5gYx-tp^{w0fiH+cVL@pB1}wv}wFk7FGugh9qjCfEVg*Og(bivy>xr zq@uxaDTv&fY`w!2(Xlju?19cCN&Xi!7&kDJNkH*b)|IdZ)J9$|E0{!KveTKGF1jXX zyF5Z+p{bfRBG<30eiTY2p(RT9>a zBH6go==sUnKd3Hfo&w3|J`Hmx_Ae(>XeE){Q6>J`hdm8e+Kr^8b7fOe)XeB?Sydqt zx>E%R_3F8DH8giSiur6FDS~-{_Sw9Wi=d^PyxVpQ$+J)WbA$gU+4^>Imsz$%8GHz~>b<^TUUxOg{^-0}fy(dqo@*eBcaznRrrdGdrr79Xjn|ni7~H$9 z;$IQ7);g@QenI43AA;H0J)o^#Kq( zjjMa|{$X4DG~hW{VivDUT&bAVmVdx{!N5amvb?d5lXMK^`_-`b{?!%obdanb}1UcP;5eEJXh0luqhG*64l@ozq*d3n!KwyymBv$dZm9Ya2&hMVrrHgYkI(F$Jb5#`~vUWYSh!sh)7ypfn+0RmqTFmR4p7@!l;&Z~`{m`6vl!@TK6gaua-!o-JS9e=CWUh+9F`Ir;4e@<^M@$J6gem&z>?<XZeCpcY1nvrxs8!h-}(aWo0{Uvr@7ZP${mil;?A-HB-h$wQd?lINsTLmA$^ z+dq?gL|k-ZL*zO8PI0`RhfT8v$PjGy4CXf#Y`;IwXCn6PeI!kI9`qY{1>RPDeXJ+t zW;v!*d>&;<<9FSSnE84b2)b;|ELI2I-pCgOsovOO&JE8&XBF4t{^wGv3lnFPv4^{H zXfH~-6rYhy0UsjK_w}3E4Jo2C4Jrt(Q%Mb;$Z15jZR*s5-Y9T&bo6SZnD%gAD)7bEnb#_! z4K1&;744Omx-Q43x)e_;F#3is2}U-KcDN-c{jU5X%B6MhsV5N{iJBT!D;u3lC}E<) zv#H4Cd7!MpeICDRCz>wvea}-$Dlqu_^YrlfN!zF7`3RZ#}58!MQnXC zL$Axz=^IlhR)6k8RB&Ka*k{DrcG<=D5fi#Dw!euhkc+x3D}-WG>syQDkskBe81y1> zO4pW?#_0gFcUWHb-N*iXY0jE^2gfyu!|pa1o>lK84}2`>6L+z+$)LNI)=AT1^VI0T zezLLk2Ri~i=R73?o#y&fh1F(b=@DYABGJ72k{AygGF(vn`;Mcnf?RLXvj5i9*?gsp zXA#|N?)T|D{8_7Ox!$%Wi~B>TWWXt(=OB9FuYp>6?jIk)#!E`s9IJ7Hs;K&{z4Y%T z^4SOxbi)Lc9$GsLrwps0LgESR&u2?kb&mB$u3g{o6rrlf+&6Kad(FRtmy4Ee(@qth zjX>T*GRH4ki!+(64&}%`A5p6M-XMUksWb%+Nfrn&N8jjGv@ajTlpqYKKq)a~DG zh;i^5I~#9jJU2J~J*Vi6d(MlE5DloX;$qS^;%7PTn^3G*CO2`_#<|TI()?GBTYuiE?V->OK=b@L}SITFS%^6VGc9&aN7@3M1<<;xlRKTy(o zdXv0R6c{lk9H;8%YnZii>e_+0Z0)a-bLdk4l@JAHMO~~!FKoI zQ-qf-zCz&1_g+UdZF+RMws}s*>np^$ zpoqIN6=D?Pui0$V2M=E)80(x>inhAP5v!4AxmgROR?Z2kMLjznuJ1yY-`8m>?G*d$ zzc+a-9^VHQ2pIb?d)zadN}$84uz^1MgzmBLOkXscCvfr=!z<`e+UlLqKn$&sL2G&g z?A6Kio22Rz2VZ_Vw<>;*k=pIQxf@Z=tNa58zq|eb*mKCwIutI9(_#KP5H2s2oJh)_ zyc<3K87G=CUDHl|y6mjrMr?kkTMNfud}G)_csToFmlR1=X?qtfm?peLKjsY@GXDNDu6 z^Q~1c<+b=&uQ3_tYgMkPSCM)L+G@1pE-`j`^hmjFyU}(3=INmTtJU*5Gvj2=^U;kv zBl4en$d*|_n?0QeSQV^)u2{Rv(aa`qOaOJUqU^RTdH|fyw{&1O-XBWF`yx68PBJ>O zRxbU*nU|SDL`%tlW#XaQc8J9a--gk7rg zo^e~r*@C7^st%#s-7}75Lz5d%*A9adkO%qsLmFS+&!eP*`A4mfMi%|)0AtbP~sL<|APqXA!UcduiFKMcp8^>gdJn*XxF!c3-ZL}K=| z5i>Z8^8IDygYE(!|I9K~XJr1Z_J#c*2jiDc&slcyZ;tDvqYMla?;PhJRnZ%8t25ty z3eZ~lGA{J5*IWa$=CcW`z}RKF*yL`%!lz`+r3i2YIA?CMuZleF(D!qy!N|%@#1B=| z0E3-XkmLvWk<}0imXPs!!u4-Ixk$e?o{r1Ou0@SKvOXTkC67$8NN5(9G5LofSeJYx zuJBEi9TU2kNXb}~iG88tT&t=fkiyr1v6w?*Q`a7u^_SE<=7G-}ZDH8?{S7wm!A0Y% z_hg0`SuuNK4-J5^Wv5DVEo1cH2%X#VRVHa5Z!x?vh3SjN7@A`&YfL))xR^`x@U2d| z^h}-*4^%yZ&Vu=Td_neetMN=QM0v1Z21(7i?t2AqMuphJP%fa8hKRli-jFh;;stdK z?S`<|B^_wq5%&uQuQUY0hNIuBDCh&uqtd*8HG`Azy0HhQqdmg>AkstxegH zyhMiKkeoai^M3x+h+WlZf~>;39Py{=P_(PQ1skGcrm@QiSzX+3$UZaXrde^GtYZkC zBq~0k{u?9v@^QLhT(V+W0xa2O2Mub%3mPtaF*wm`8`sj52=;46brnw0`k5zB%s*rM zX&Z9MdCU8uHJD6oC1rB2&(a4RwNWk?R0nqHH$B27oSkRhMHt)oj1h6pI8=Ff8aKT{ zezIevVoj(d361-|nM_|YIU)e#r%_kEqI+gz8m7{*mUurbC1}-ZcUQr5Xt}rv-XTtnz#Hylk4cPo z@gA(N$hSW}-^E!9q_JCJ`_^KAw^xpq5-aJUfmU=Zn$eUZr?11{BtRfd*cgHOAWkNupcYc1ejPOVLkh~9elR?S&{N|^;rFx| zOLOMi$n(K&9tHfJ_oJhC=g-tVayoKuoeAN*e%+q63IS`}3orhF@Te|TR)ugGI#&Es zoLZ9-PH;|Sf?;y0nl(2IQqPgjTr~H&CXB%0O%gjj)-h7ioTO!prZp=i?k>W4fV7>i zW3u(;ccS{BS@7iQNw1$WVrTUI-{|a4_s*pgXK%S|-ARo5I$-({U0-q!dQISMfAj1` zbIz$ejED0|nXJ+Z(B!8U-M`9i(0$MVz&Q_MD9}nJ!En-_$Ddh4#4^#56=&is&zkXt z52bVRuIScB#An2s0NIl}4CjT814U%d=6YzPSkIoNQfs&R_RGi#PWQiG-=PQlozFTQ z`#J?o@xC*8ty41yqzsG2bxL}`Ov`eaXrIy-|4E-1ezaTV=2$I@WIL`Jvr|}hrIhy# zk&(-K?QU6LX1555A&_54ldf7Fehlj81+l@x{y~}4#`!&q9L&W@k>rB`7Ix}j6w~YDF4rqzR_B2M0aD!yIR*nMXr}c z{}??2r;nCSYbZiLPR^^>oCIsyF2bSJ7@J+sPN|S0!d0prv*C6!&PUTDthc+x;n=`~ z33lD4Qj$rXP8Z)wnmW5Z%M9gI-a@3%4Z^6+5-!4t~jt z3@)QxCKR(295>fZZ!w-tWZbo1zO(Wv)z~50W8)DWX(m#p{oLfA1r-l15w z_46m^EyxpBUn>YpbOO5e?m}vNH8n@&fQ`|C$*jExzdpt2bWwDZK9{2Vol;M+V@n|A zg0pde>eKfJ!nU)cdMayZTVO+ylp<1hW0h=a(VSS+{}-HXO1g? zEJna}=fNX5<)9cJH%*A%5SdI%aLMrFLVB+-y%a-ZJ$TQcr{utjaBw~QpyGJ$p#!v! ze9_k!YwDHsR$fR*QIl1J5rs79Ev0I_rW!fw#Y>7`Sw#ZiiLcpc0*YzZu|EUKc)!1P zyf5vp1eae#;@(D1yk>{}j(>IIsGcGFGA%3RpwimWiY!F}PGDazaZv+)ET%`O@lcn@ zU$>WvXF{l@-)l|+DuAlc@o*_`YY=gLw;!54<&&6=e0-tohdfai;Z22_9P_Ym&o%%# zxlgr3Cq!^z5##d^#g8Q~ziaa)|KnnX5e3GYU9jDzF&oz+5hu&R3vlsf-FAr8_I?c|NCB_G&8Re9sl;C=KkJ>_62L>TPKMz z!J>q4IysZI(O=u3?|1IZbZmqjvvch~VuLqBPLgmI)6R7EEQab@1WuBkt8UQ(T#Oj2 z^0X?e%CUtbO1ro%edkV#qAAK0-p!;^qppWmY@V`VWO@Twc~RlfaokOy=6pR;dP|CN zbl$(fbWv>pUPe#`X`S)d?rYPQ4vi1JN=3k0;G`!naJ3lyjO5PWLEf0vG z?OV4@V+MhJ5){Olc||GF5<6~7DW?^g1ziQ`l5>cAQTeeV;sg}${}J0fUFbY}+kfS= zqONgxe$kLYwtr;z7$L2HlhZpD+$-xPIcJM9RRZ0ts!bBG&3=`*c;`q%%R{b7E*Ax0 zeb_LncW6G-PG%PQ0q=AKe?N7yq%v)tDB7*d7PjC|J)K`>L<j$E7Jki;)WxWD@JM>)>sE;t zM=n>APhBRqM24KJ7RZLCse^;MJQd;8_R_tHb!)}G{!UHq5XRmAppobRNIX=+SJ?hR zd39A5SRJS4gBUg5qi9UYgjzi%0nLn??^UzjWcg@utK(YC9pP|D7$ZPk>ZO5_iTlnj zzg)^V5@+|HiHZ39#?;NBU0^S4ki= zXnJ9Jy#I}DMg{H?437VwthQ-ERmeKgMBM)yYex#)1reJ2KR&zFfh2g52jBe9SaIMk zxJXX_*oyV529oe3g|Hv@PuSg2z+E`-j{ZmPdO(}GPWm!R`cEBxxS-X9jSdOI65Xi3 zvA=gC;V4x2zft;L3IAnv9tB7P8$_q!3eL{mMZ<5`NAY2r?e+NS;Cnyl5`JXafc5s% z2GYwXt*6IX!fpW77w%~PlAIIxp8IqdH3C=_MBseYzJ<>+teg;4+jgYG@G>xab&_wa zmLDcetD!|m)bYKQP5=S#FAQl~-F)EO0k*dcqUu_$yuwT=H$k6%v zzr|p4@I}<^tk)RD#)%AOY0(D`H3qrhqw^*|pT~Od$N&DQh7I!IHR^X)?oZsT<7;9-+x>9dI`moA4ckJqk+r&iE@sG3qyS4CtP! z;-9^i$FY{gzW~PH#LSAgMHaaLUGbnh>~+(FN_FPK#GR6v89#?fEik6PWu^odid9F_ zKA_dgp+fc{xi3xjkna%G#M{vain94p(0>=wPP`$A=(=PL63)X$gV6w6C(p#0fJlw1dEXfclNTm!w6Nku+?sIxmDF|hLQ1|kDvQnD%@M%? zYhiJj3C6g!B_#E@%Wl@`W%PyFh}XEvgYY3MZ{JSml>@wg^BIiS-q#hG{2)HBvDeYk zUB`tu|?4VETTfqsAGW8Sa%CfptDY74i~R&p|~@M?U&1w9|A zV}g?1RKL6ly`7z!J|ekd5Q|iSOV(uUbU z?bB;&wqb~*6xFY!5O+=5rRHS*LjHlYfJ8=D%*FAvW45iz9PHj;(_i|c4)yA3xE5Wl zAz7OUW>MZI_-USYVmbqmU+qZO=tP&y?_xg>xu~iCOi0_ErxRG!Dsmvs2XRmom}F65 zgN&aoJ@gzB`cPlk1BzUm?AnJA`uLW+82D4iC8fJ$4%vH4^eV}OrAB2UEqQOj>C&=b zjZFE@i)G&2bCPtW5X8XzC2}jb)RK}@qXCy5C)9u+_~6GpSl#L8l!0$g=xaL;_VVVF zrsS0v#=q7G)kRZ644z^;Q4p65#!_s%uj!Z<=E^*K5_!i@XX91_u%^WPdRAOt3$*E? z#@04nCpS}L#_9<^u{yaf99T0N*T~$S^CriSSu6uJq24b0d{N1FPh!`QJU~4tngSHE zpu%sf`-&%~L? z{4l_lH6n0oim+*DMR8$p!O-bu01OhD0?~b+VK{#Idn~@nWb=1i!k`Gcm zQagf$@vA?$Lnd1v*hI!_S4wo3CtM`XIJaN2-BulAcN!P`08)kEQDb|)xz7@MY%DkO zY*vi^slfA`T#`wJV(--u4*HG~UJP@&z3cw3cAhlTd{=E=61 z19+&aN)EAR^2#c1ub~%0Z5W3WLsPZ2Xx z63(}p!z5Xs&;rz#E1q+GyHk1Sh{pZqxv4l?(bPWb^#C#adGE_tNcxloHj7g$BLF_C z{?~ZzAb4Stm&tLM5|_3I)?MiL3E8m3F1jj2$E&%@QO`|rz}hK|V@gZxW1k zq*{}+l6eA5C?cgJ5z8I@R(b~#$#7{C4Pyf_&aSaEd!B3tV8y~{m$)_jHid;0D<=(8 z&p#3@yPu2|)S)|XD2sl71hP`+g*cYQ)%;SHno`iAX)xA@Nu)GnC7*ZsI!&`%spluL z{|#!akH9|qV@je`J+(ATv!YpZN8EVd)Zz{AinfTL)UPrfZ8vli-bYxeD9vZVoV2(b zNl#L3WthiLx7?eg8ySBp0q$571_t%ibNBG(^{V5zP51g`Oo~-6(}OgS);K|WQoriB zY7<1Ps{!)#W#{0@-H&w%5Nus|CoC}rekHep+9RrGb!-`V!tj)q^d#;vY*{iCbBG@) zB-iY%4N0An1m@Ef4ZLilXJ{BOmz-tBQ5_3;@gq_*0qKImbUb(>wA6dnW<-0&~{!?Vc1VM7U$kK zHK=^zx*F@e9pA~&RKxd@{v~5!QIo`Ld$;!CWa94d<66e;Y3hKmvyNiTEOnr?|ko&IBY0R4`mEzL8xj zPs%#ISj|pZa`dvXe6Nk;szNl(wd~49+2Iwzcje()Z5wp2PZ^hL^x{OFe0ZjHvROkQ zdZatsYX6xj?nv)@@0*+A^rofuqn^ayLoyc!Gwf*;d5ij#$YNMwxx+2%OVZo$WA#fv z{nu4%z?hy5@xCKq3`bPk<}q?2drkkNH{pB%5WD}qQL}IS=W2HWW3<05|96rOw;2y- zO70(eMO&JMu~%Dy}ecI0rh>I8HODfwU0)tp`~LP!7+R zDcTWMqO7u`N480yRxL#I$*j(Z;zrd%wjJWRTT_7^`jv7IZ<{2*z_{I>ln-6?XG6$Pw zI$h01&V-*ebjNk^WdVV=@jtU%G1k!$$=*ZqpJoz4q+`?|VvMLb1;H!-sRc34BLkbB8sFm4g-%>a3|tkcY&;inG-YGVhin*e?a(@HZfhkTD7nhL4Of zFYIOM_Uz1{oIPJ~U54!4nVqz=fA@3AhAmO=HeTNDN$3!q9_U|VBs|bH}XFAmXiHZV% z@6Nso{onpYGxw<=H1QtmPa4jDLmfW>V2pGPEhh6Xyi$ny8{!T{#i;&^y`KKJCJNGf zib?U=Pz$JRIGwvLcY0vrb-68&vVoIra(oqkus+_=%gI{#eOlLK@F{kq%XWiW(fQ{S zw26c9Q=0gcm8;V8om8RClx%Ondr9sSsqLc)OwP>R$F1~(Et`?8v+8?*6BN0Y+ z0A{I{_9fj{PfF3dHc0c>&Tva>x&FNLF~%%O32*M0J|8WQWp56$P2C3kunAQw{LR${O!@su!Xv5TQ4Ey6gf|AB9+*^XtI!mm^ZQ@8X&L014??Vb41eMQT9)8Evfn z!#DGS4ZW^Qw5lNX{~{n!zIbVlFCK_T2zg1rf(JB+gH%?mnEBC45g~pgktkY{z$z=o zx%o)vvv*gOvFL7gjoj~4|NdYy9ZZ;2hqNr0QB7xTsW>J{%mw_c$9$O=w2LqX_(koB zXzZq7aewSzjM5g+{Q5=_4e=vd@LY*(7h45VtJ4Rs;s9mIYjW^Sy9@=N@QY$oQmC6N z;2tvTtl0iJ*}6c_J@b|8`9X$%Mrx*EZ;jPN9iBW^P!**VRZMuPx>{E%WE}5?lsrY; z5=6)Ri|D|&pHQ-Yh*Q09LodRN*D?5gD`qUV4LySUiEiIChv&t94jg>UD2ZsZhCV#> zP#dvpx7#fy6|>{zr#A)$ipG~D)~*|doYAIq18S!OzXgid7-w2eg^ZQR^7&9y^OF;v@fRwddL@+ zvlJwmueqOvF|>E*wrVFg=_}Ziu=%{-eu~?h(8fos9kf2=8=votPQiEzyiyiw9@WZY zM5f;J*PD2Iz?x#i)+LdrTIXmKqjmj3vVmEfX>Rxc{zmBpp`u>%{fhLI)ss9O)f_Hd-Hqxj2t+mBO zOF2ymeNDU&Pg++`XGGC{DtJg|7HrEwlfE%>8Vj+L`6pm$HLC2gcUQ&MVz2uG(pF^N z(pGqliIHV6!cIzwL}d`B>%#%3b>p(^uDzeJsR@#$TAQ4e4M#|%(;^%GtL7c;DBg1l zcnV`Cv<{5ltEe0@^Mp=a?ai6kabGA}O|0>=etg6k4J9kmWX~XSR}h6`PH_B|Tz&V> zKC8hPs=a_ra%!kIPr7b@lA8D(~KE+^kbKxwx<@grH6Qxiobhjjj#SVMpBE z-ONV0MvnH9{c@c#I;r0HReGa-zaeJFxT?3+`t-*OJAX!aJ!4G1KVhA5GFasa_j)Vq z1BL)pE_y3JbC00tTJ?3;-WfT_;@x#NU}BV91}90Yhm)E*h&mlsu}-UfA!gM~E3@P7Mp1*LEE=ageG!Og$uO(E)FMUXyyVSwJ$Y_1r#c zk=S8C-cEb%bWta%>Dbwf6Uj9xfKgbRuw(s0_g3Q!X$)1jw)9_Er&6QXU@8+}+x4WD z33=?%J)9ygoLVwVyk!vcU~cBo#mBmDQ)9Ik%$oh2o#-4>S6PJX(>3K~tmbjdgaNBU z5BeZoxvC8~8GMtWjtTS}5?t!%9Qmb&JKVJV9qyA{{s-}geXVyOSZ#>#d>9ehQa#tR zORI!DQQ+`LtmgD)4iY+Y4XG?1Gp_i9Of1AMnrCl8^v)7|9 zmY;qj{xPOtHN9SYU_TF>_h}Ua;50d({@{jo!DkP_PJnHOYZ~JZf{_zqZRta95n)|? z&IzUKRn7<@+442lLgU*v>ouL5yyR`FrAWB&3?Yc?v3yViL?V9n$uWX2n6Wx{{D~XN zc{NV9Wq2t$m#jHyNd=))KOxHF1sm?UZ>&e9Et9)MK|Eu}Ps;jtAUzU;sG&;bP@&Y@WNyK01%}V znESnL2&?Ba%w@Di(D>Jf02llq#1M&7!4eA_tXpLG$ON zGfq&j6qUlJRp``KsC1>0HO585LNiu)v4z;1_6t3}$!`*Ha#A$Da*)ocqB&rz>&h3WwdS5ivvn zMZegvF}AHBw1Dy3-|A0R zxF}TjG)n#vxXq;WP8>XOKgtC+i`QGpuc{^e-=PGicDEPtKl5?lEYay1a ztW^QV3_Rhd?C&M_c?}9h2FqA2cJ&7r<@m%mkDR0mW2!(1un51K)}XC1b7J|FPy7d+ zh@btFBh&Sgq&J;~Ofawu0pzE2cv}rflQpOeTpy`Ko-U%giOr2oAa8qKNTindbRM^K zcX&?7{m0g^Iqry6ncT21JmNjudv46>+@LQTOL0zKln_nV!@^J7qqftof{f-EKLW-i z8siVe`QDsXg|7ms{gzRo8s&ka3!w8OJJU#qNGe#BLXcI%oIP4j_IqINizxeT+RIGnd>6 zmbO6=SR6*n*=2D0;SvdBJ8n`RfFC8_BD+-7n6m zr`gLRhk;3n+Q%Pp>aGZt@sw+P<=78VZBaR-AkB08yQWth#n6BxMW{UT~3u^EQ zgUxh5;j+oz}gNSx-S*HGLm0GclD9TL1L+3>r>eu%F(xrBc|7HifUm z#>-U{*2SdfG9MM*&3b1}0!5)`_Ce-;>n?^ks@lk_llz@hG_o-0f?x~M+b{mM>nw>e zsO<(+FEhJUm_-W}?5k$cJC3Dl08^P*sG-&=q zLrZyqz+#eFDD^+Y^Mno9Dq<6G|1#yyA8B>r=DDP10jvMzZ?Ylx0=@KsFJ3EXej38& zlJ$#Cys%|{LOcJpZpBGp&_7`MDGiu^Q1TZSY08U9r1AIvi>dm*$bqCZp1k7w-TzBG zsKf)uNP+bq{hv-uN$)Q3-yi>)Qb2fENz(5N{$G$+Ve4zr5{T5&z@ilV z!&^^yfRx_9BXz(0Ytl#p;c0SEL#Mx733^ldg%@^ifok~vYm)z6hfFXs`Y*0rdI`jI z=O1}MPXEEorDT8khX|ed2l3u#0f~F@f!2Tj*GwVw{;0pDezAm z@eu7kF?&Fj(WHG7{}0dhe-Q*RBfHN_s)_!`4p7G7g>XBDv;Xlb2&B>5+@zB9zue6~ ziT}&n{O$f<#Pt8)SnVnZL?ZCmxBZ_4e8_WeEPteGbfYzMH%|S!^XD zG7y}+@(4Qzw>BoECmvPayTXU^N#r@8qH=wJOD#HtdxfNh!RBu6KT8t~1LpY1X`K73<*PwE+Et6{nQZN+|DB0k zQQ#!BB<|f3wcA+>`YDOlL*JeU<9@`Tvz)>+x68(Bvm&}4L_@8kD z&la~Ewzjv6LM>c#b8We}NvV~l!emgR!>dGr=jlB?7H3aYM0?&pfx1+KWGW*IDiN819)fjf67>X6MJ4l8T%d^ z-cN12N)-a+cjNDEg4AFiR!yATWb?Gpe-kgv1>7A2Xe)|-O5ZzvE(ALezTQ_Fne2KL z2mO`)2{v#O=h6;U?dO@XK#Un85MI4w3pH@Ah+{zjmR_RH0=VtC{Lt_$yn)s zrxE_0CiUG>!9on|15i+P)$c(B)Uyrn@n{r{9b^zA{>^m5EIFCQwmLekEGp31+(-YV zV|vfT2eGCdXjv4=DHx-~pkzcqa}|XuXw-UtE)wxAR{id7*aEx?ucG`0IqVaW0ATHZ zz%CW&m1uBFb_c1SZ;^Br3EU)#<9T16bGjD-^uFvq;-6Y@WJfK^=ylD0a_NTyay?+S z&D1JF9HaK*`FxnF6W#BA$}T@h>6ec&2C3^zv@carK114zwdCbogq2rSG82+*+k!RM z@7w055};8b`(tcR5S_Sz9}d$4)4)Pt{(r3@w-F(^ViRS1UR$@Lj83gy4y~Ino_nRz zxl4(6$`VfbQz$tAj=1uYvbQt3`S8k8-qXLPj61X~%@w+dvUchQj~s`rGrT`0ZU}n2 zWp|2ly?C@Eu2k(*COL3d`9(rKQ!SkFIgXsh@pa@E8#V*{Q1!x(wvl=My;y_gTH5%? zx%d_{o7By?iYCW)*_3-l(H=E>XXc^u^Y{#IKB);un=T2S6w8RSI)$3IZzJP;5q*Zp z=N%h1bdkk25``C;E`ocCe?L(>8H9&b!3Nc)tY(;HOO)5yAbs|JNTr^zH6925U61!Q z{QvwHfYAIH>D{5g)`xfD%C~uRM-`205}V2BL*93tYxmIbwMzCO*;5N{AI=431}RG} zFv9cpq&EerGqyB6!rT07k3q00&ipk{;*EOA)|%6p+ADBh+|0S~5WoS$np148wW1^S zcI=qx#R|Hq*0Y*c>Bfxk#nhRi$E)l5>vuvkn{U96{Ls6Lew9;19;+jQ%IT0%RQhMe z_^{AYqvB*MqkNnE5U-{tha(<1B%*Zuts@x*bN#E8fvMy2F#B3whM;8;_{r-m4HdV! zd>zBl(i*Fc$$H5mgB7sOGs+8C^je%{q$Z&D)YPeK#*#Eb_=g0P9B96YrMY^)$WY4a zF4XvN(DCn&#jWi{3!U1zF4JuY(&Q429;_ina)w=iy0l!kq6>&s&izUm<7+xuXn;5o zG;GJ$vBZW3Nh+BU}&H(kk0t9rs?-)^{G`47;@D>8qT< z8bCCeX-VK|7WzfJZ{YKwrbC$5jPxN&K-+XbTqT3ioX}$3??Cz#Z-&W-7oPSYfb_h2 z>z>51APk~B-fu14O4T&bf)x0LJ_@Qy+Aj}BGdM3nM@_j;-V}D9t3FwO26Bs@#_b1P zrjI4QZ-U49S+zets*(k<%L#OZ#FF1WW@9xcg7!)2F)nQI;k`dG9teC-1Ishf= z+|axUgH*aN!`(UQ-nS-&yX92 z@v~+=^Hu`hJ)@ShF40JEE=|!1AqDubDv-dtQ&k9au2K!GSa+bB*2Emp>KGB$^P0a&K35>%YB5l>M;~- zw@rp8@ht#Q}7KFho|rFjG^1yk~(a9*Aee=Bxt; z@>3kb8=Q!R{TOyK1vUt6SM7zum@*Ro|Bt=53XZD>!UYq@aSSoD9WygCGcz;95HnNE z%*@Qp9y2qu9WyhGnRzGq>)x$ec-mWA`>=1LBaNhPwRD>F9V{YS;Vh=1Cu1XB;b&WC z4#zbo6S|4LAM#a&<+HOn29^%E-Lj3^Yti6s1Al(m(7UuGP$P?iE*Qpuj%aAVzF)p_ zTTxWUSMRj@m{0bp18w%ttWI*o>*91%DxGAj9G&#yr?Zhe5yA{^D!S(g1D|e%!Bjwc zfds1WfRRO3cjT`7$C#vnMcKwMFp*(oCC+hw|Cfmb9K6&J%}3gB`wxao8i14uw0LxF zvI{_mih>k&$@}ciCn0IA&VR9ALM+}Yhp+A?jvM1lJcshHegs{XV$y)L#iAw!{IWNR z`C*%PyVvy9Z}6P=AX=~i`+gqvsg(TvPu8piWs=t*Jd74|mz$0v$y8B#)o>C8 zz-(4ra)4 zK|;?ncxL7t90u`E$rqhNE1e^N`yiP*Kd&x&Qk&BcViKf6y631<2WBw}(|le_9ClOq zLFEaGm-2_n#*JC?mgk}dUrMeES(Wn%t^I1w|bx@SPh9EP3xm?#=h##a9EF z*cFS~Dl8M6PVd;6f0q3Aoo;-ALj#BADe$0VHS@nb!>UR#XF(cnDA(-%lUF_B9asJ$ zDJv{=<9c4mGyBEA%24HX!G`IrqoKGc;+1w%{SiYZy3-LcYJ;8s-G3zU^YnwG-NnV# z^JF=dx990q{{`s*fZUDam0J8wNm1}N0L_ikE5SoG_Hq~iD@}#Ai6Av4uyL37)%LAD zCLoGLcs$1Xo>=EX>2@AdS3GAFYHL!KMuj#i z2jS}Zx=OTIg9X?0=+*40y!vl}3>r3Wfj7v9naQegxse|;ZJxevz)iuhJAu=LUjODD zZE?G7iNHHgcBb>W$lsN`k6eZ9v7BC+Zwxxk)z0-84(P8EOj z%f#P_Vd36AC?GYb=z=lr#awr5ECw+EjhYZAw)O16X@yuVl3iwF=9 zZ@K){LR<<`^zV@M4-?AxOve#H%IK$z*e#tcCg1SVQiYxmHzuwUuuUwN%QEq2U3i(V zyFqOA5r1AC4w159bfSr3{6CNFMtqGfMY(s79P0J;cM)FUhefrru&kbiT1=D&X^Dj- z<+ZqKfcJ=BV%PbSxrEEJX0{@`_5+P*f?4f4zxSa`86Z>&e%z7Bc9zY{w1eEVt~ zs_4NX7Sa&;8#eJ*az?$jOG=itlg~*b09`6n<-)(!`4^vbqUV$B77K4vvQD{bsnx<( zSUt<|O8EwxAkH_R;zp1fw)jU$%c*_2=C^o`Dq{D3@vP=nywam^`&fr&4XQ-o}qNfnKHA`lP$b3-Jf^k z|Evp%ez?lxMmhf#u1`pxrd|DOemhC7q6KPftHS$|<_bK?aGEnV-`_xU`@QaD*g0z4 z=*xee;vy7M(ax<7)pP)4)m?iOK!-$e-)YrWU!}g@*4LM8RhuA@2-2ZaKl9kY)CxmQ zGQMA$E}S;Lwl@J-Zu)5+WOO?UzT15#1vih=kU5Bqj0Qge`&=Ei*Il(K`*v*AS%Q&kBO&ck_-$dLQnFLw;Nr?|lYq0(BzZ*bE~-By<*RmDKE5zo47 zj^u0C`uyz=ZsUYCYvbt~UP{42l+#W<8OHLF_EWDhL)cT8&jXkv(nGC5nqIQd6BPB8;~C2zuH#w$~myC#=w=f0X0tyNE=_} zLj0SR8t#)vSc|v88lyrK>KOE6h$AHZy*TsORLLaj1V=650V8pQ>Beqexz#mG?XAvE z7SLOMEc3IT(!qb4zOD-?_48Q~n$?Se^Jx~MHwq@i>q8hyvSmFs+IRGfZLCwoJh{g^ zBT%k`yVgVRTEqfuy#SldsaiW3qnTS2ikQi^J>$9IhwvE}Yx~^JK`0XsVF(Wa z+GGRXTjC<@4G$T5@IFxHwD%B|xyX)-#WrJWMUG4IY=c&_llNnVinQfVOv;lv~&$!m9~G2DdiD~LS#<)zR!=NMncWTNjCrtrQzfk39HdPN@r?(=z`_oL@CO+o?gR}I5V;9afUp<${l-De!ptkstY9c~6U6VKKDPoP#P z-Y?n;+XxH}*hhC6Pv4DyB!76O7d%p8Cu~ZwF zO-xr_AIu9tf-K(kUGL zcS#Qj%8Eme%_8XC{n@8sezI!xVB%}A#EWiF-$12$t98-xyid#j6_(XQdD8A0oFDN2 zfMu1lH;a}k6HtLk8!_&r-?`;=9eSvn{oWt_+rigi&llp2tuG{{RDA${>Mkdpj)+Ds=3ovrgQ5T56Pt`a8 z#oQj#_z|5FL(K!S$uR{Qp*3c$5zekV6@uSRV9;usj*@e5R^Kkllf3T#0Ch#gyrl}C zjJ0k(-4t97l+s>g{Yv1DH-(? z+9)75A$ zr(mrdr7qW{m`tWz9V2@ze@HUDcy%3k8a78xv#2_tS4t+P+xXMQ#IFX9&ivnFU1bOw zAKgVSWg8~h0|ud5a|agklx-bQ*dlSkd?c-W2)y688S zlxIYTFXKzkdyETq0T$y%62GJtCGci#XZyl4?@{Ys9RyX5rjzeou|#Y%-FIrK(ju9N7drqQN%1L=oxGj&SQLY=yNU zX8E^sd26?T+6U4vk4#w=7$ITC4e~#vT-RD-#-+lfNd0_n;QxAjgh{F6WAT1h^&DrT zSZVaIcukTg-*sgk`Wd(uB%);LWUXcMj__@~-)uiIzZPLy8`$TKI0&rSN<1lcfncp3 z01i!SB#qeJ^=8@B9=rS7Fu&SPm?;hJ1^2TyFLlC)WyXdSxH^az@ULG^W6)_q)2}quutFTZTK!eU%bF9Rt7*>fY(3L-!N2oy0W zn8XIbD?`xe`b(Itb@$xe^WpjGtc+xW#xN{3Ovi4{p_D?U zODhF;azfjL^E)$6F0|Squ{94sEfs`krJf$*mf}MRg2&S{j#+m;BvAvOw^&nwGzrr~ zVE|Jhl(p-L!HZ^DKAX@`pKtv0@$+8y>S>opW3I-S2d{OMH4g-3)l(efL>oP(W}@sX z!eLr?YqW{%z#3l6#67z|%@f0z8K zFQ@{WNNP;^8ylVU>#v_uRc{+$Eo--UWITgN7N{nqW7xv!uG&m-New1AY5;k43iu+q zdH^2&9Uj+03^{!9J;Kj2$7c!#$p%SW>xqe^(e;#ZBR{c=H6lGO2qBGyeXR`lGm04%ul?Pyvo@=PLZ@1L6J&^0%_MPSboPSD zwL!7rzFpaha6>E6H?r@I$suyt#S+q%^si{wA5Q{TP0&{(vx))psaiRQ^*S*7$CCFb zTiVC*v})Vei5j<^kxc50Uy#Rt@_hS5{oV2&!DP{#-!9?YVnguv8%Mgt@6M2EzGbR} zeIc3u30YOsKDd@>MmN;5OQp_9THbjTHGu41o&7Ohv+pp}&hCAXKX%x`9kGbMC&|#|Hn@Ai+Awr`V}9Hr7C9U@d5Uzzjxx$g4uR8|7eergC%BP{#z2_+Ts(9-UXj*Xwv z@jSVt=vbFUpT}9>THBq=RgST(9GlS=&e6vXMKc>72bx(fre?l+1V%a^;66V_&WzKt zxk=SJxCJ_zhkM1N9q%#D^YWbiBF26biSHZA+8(uTxvovndLl1Y;niEM<>^Q%fP(V@)0&y23r8(1x z5Z*!wCG4#0lM#reesxuJM!J!SSQN(M-zYKej~3VB78s+FXm~%B0;*v3 z%{pQ#JVQV`?QN?FaU5s6$U|btd6!XV7rkmGlUi|=p0D~Z097FD{}F&{z|^D;PUTw> zjP}pV)^CNQExfUbL$k!fE2{=xyoVEnNJ`kN{AsXUY-@q?GAkR(q^!AsMtA@dAn%L> z@B6e60hYXu?OT%`7qp@-$(}$!15o@bvk?=EP+w zCJ>L5e$Y8F7Y>vUNj=8zJ)ZZ$@#%V9yjWjw>`^#?E$N;_WcdB~dp%GZ{N+%=aR zcfJi*3;x8jLaoW#;;huF>An2EYC*UBUfbegLAR}OVWG9vLQBo61D<=O>`xgg6=fKH z4t_9yGtzao#C4}ze7i3=7`Ur0-&N*KYU)M%_|4>#x%8OnKs$g<T%TS4|qDW$F>2r^V;aK z;7;2f&Owh;@d1w^dL(qa&cKPn+cmoKdE#6d(Vx1y=slGdc$Vnn=WEHdEvFN5XtJx1 zJxuWrSRWXKC~CUkKhJHB4LG=Rt^=pgqTvAZ;Ck&jI1Q(D zu@T&`9yZJI$YsWis;oRUz|j(@v^a-JzY$J%gIl788s&9pao;cP(L`C%`q+l#Vioei zMI*kUQ&CFgwEt>kinU~k-FjGQ!gGe=tUCj5y2;;uTG!POCtKO=`(EybaeQ}QR`}L8 zH|b5#yv{ayi$<<)kon8B&m67;GvDxPt_crW)0j6|e=a9Xu>!&%9v4qEMz;Q=8%6iN z=^+fd56fR>^Ym_K@4S|X(vDpMtB8_mGd_2??S1}k_F96(SX})+G`m?)hIWHU>AnFW zC=!THdwH4RUSli=(=>Hfj@5V3JK&xz_$p4b#7RXn?Cz3>sa9<&wKVQ^Y6&#oVQx~N(N6l!$PqlO`3*PSQGclc{$v8vXl&^z{ z_J&I>mJj6HVTwo9uaysBjJzO8NOati3fg@8C9S%!$b+PsIg%ROUkMLo@VL&IZ0N+2 z#lx*x^Ok}0IC$Q4J|1<7;Y435j_N^3;S~FRV~6lL*7<9jDv&jECV`2%ttUFsT~k$IAhmy;%cTgtswRl-w1L4oNy(ssNK^Vxt^ zxD}xU^&rwZerO`5r-9L!F)CwU0Jrw#JB~L}uO8)f*V|AbQ`AFr_=cTo@xrS;=iPEx zePgy6Ub)>>3ReLB2(#|0z2O5b}tt#qP(dsDd|u9T)%cUQ#LWJtLUEt zt2pf^=V7*;t9VHVhN3k3?(;9R1lZbi#mrP&jY>wo1GLT`AA7%nfTP}D(bD0U{feuB3NkbGO10v2^<6d>iJ@SZ#rv@>Z7D&Aq040%qO#|hitZ`~h zFUFgSEt-u9Q_Hgh2Tj&wN;dZjkdEK$vvm%f#AaRaf2OXVZucwuo(6Y8rfcYAqgo)? zu4)O`^88q0(WqJ7wCJUFUyzFLW7UtLhAi}stH zSQ>63&FAtVB#=fH0xGiVO}LH!=nnZIj0{H=gC+MhQscJmuG2`wQZ0DGzyNfw;q|M= z=PRO(O|ppKUn*&a1h`#YH}@`fxj3tGY9-1;h39@8g#0ZB+wMe~QT0lMYuK3ch)GB|D(6aYkiw3ew-ata%N7R&487mM503UwuhAGw=$Nxgia1 zNaQMs4KA5ht7izVuw^&s2I}5@RCm1Y1E(K1eo`9weJzU^I=p>2b;4VsVK{iq*(~V**b>4f^-e1 zm)$|%?x~=vufGa#snVh~rl3OZ)|HkhV4&>y6OX#|fKg_xit!uL?`RgO>a+mu+s6Id zlJMFe{w-P%Xj##MjJidK<7cKKXya{J;5)H_=3!NJq<)WeN5mYjk~fUTCuWGnP2_{c?mK zH8P`v&QJQuV9HxdI?M8eykvYoQN)R=hYtcB?ef;wL$5{E*B~b9E@R7#TQq9< zDcwfHTbP>J&{;N~^tn^wi>R74{MlWknXi9&YQeL8B1#|;n6M8d!e>H$@Q_c4`2PzE z-RV#@@QbO{6>m1~dpSY^xa*<+I?i!J$RScp6XQ{$`1im`)CWZ(Gnb_2@A$q40-(}O zi76$?-$~?5LbCJJ*Z%QwKcQAYlKyXMk;&bOeR|7AS-*){*@p%Hdw7n7FS0|+04?`l zkriA#c4-SA=08fBrF>9A+xp45|0^yb;ENdg`&0i%@D}Z7MdEX${LBA}`a+<#uyAz< z|5)ME2I{C;Dxw$pzalKC?f;@di;F*6sY;5r0dQVX)vQ1^k!aj|a1-ehC}WvGg?37) z1S6cjDw{MO zE?EJ&5X)2&8`i3X+*O2MLQkFZ3Lxysp%H(akq>@hairx*?mTDi)NYI@6>~NlG#D<)f~=^#Wz>m8QM8ILd=$=M zK=`FDl6U53@RnbDEMAnVGM+sXB?`~|zE*&@Vy?0zKtzAD?2fRUFa*D>G=WDHPk5!W z_^V{TONg(&53NAJpe*{4FS??G@!EAFj-PM~2OLW^wuTS%rtS!X%Lgpi_(E(O^lS(e zhVBcx@aR!1yjCiuHzF}4DqpKx%o{GRGd>P(M-^u0;2(0%Np3^Vuo_RCqG3Wyga3dO zf8Y7>%6%fAkQnsJ*ij*!7-pIesR4nSM+j^qhS<~X1jh+4gZ|a?YMdbR;{>6x9Ff`y z_Bl3lrqablqa`Ypis{cs;@EOU)UEu}R{?B{keVabkneTZfCI6wDpzhOkbd@xG0q&w zJeQ_LL#*mK=fUkIa6A|WoG|}YUSf3r?gRQqq`Lb z(m}iSL|NA9(#!TPJ27p_tYJU$MXq;3cw~Hv!vky!x{`EkM2MiW(Onp^Q*j`6II8z% zTM7o9N|km(J#Qbq(~Q;;Vf``OxFRON32xlEGIAh*>>%GX;pVjfPct0$v`O=HNE!On zo1iaiKq!6(c>VK^Ej{XI-^;@9rstLYbhiZUwJ4UP!(psROT`D%sXtZ+hoc))=8M~V zMc#&Eye+q`CG@v#r)Ci+s8*4^GPp)2R4JCiIbM*=z%rT_Mu?H`Li8$R^$Pm$brV&i zSaRRTjHpyzWioU)w5$?BMreNG@WxXj#uM588bdrSC?mF7?=)5?$QK@;xsGXmWg$k_ z3>aQ_EM+I6M8xF}*7K50g3*v_Vl>k0^tn}jm-=~NWORTb!-zU8^gIAFjPw?0o61TR zCu~ifbR4NoD&{4Slnj>7=Wdg%4LANH5fZ+VAG)y}ure-XN&H`=@ zNiEP{PyfY^7sa%NFv#$=9_k1K6|689Wsz}ecRs3N_#Pcs@7<##$gAkkzvWm~|E{=v zq62?|U)tRf%MX|s6*e&-$7B5lYE2o%u#LcIriduCf6@`Uv$eUBEvR z<&CKIcdu9#H~ z+Wpm!oA#q~o#D5UO~s}$<~<}<7*rqUXkbO5 zR)%_ODfAADQQOgSe;Q>-&l*4Y7n^Nb}GmNV2J{NN^Jcb41$Ie3*!u+h1pW%d4@`np2j-Iwzw?9b*Pi16dSs7=pEI{?PcmW#16U0H2e1p(8q?kSZ*>{W*>y?fUMHyGu z7KO9fSA2IsBc%1AVMH)KHJG+oN(UTmaePr~M@HkOphOg~O+U}{Ef6BLFuyj=k;>Q# zjJy506Q`x*|GP;!G^D4DK|HHe^VYC3qD;1m_^u|94yG70YzB#haPamlL_z6Ae;?u| zT=<|?iQF`-zYL#-z@l4P+W)(7jxVIEFJWnL9Dr}qmyM(IE%^4>^tXc(#W%#hnexc- z{u&$X{zem4hy+wbSbZ3R&H5whP#%Mx_8{=vTq^~F|f!QMjtCa4- zDK}X}>YB=*^v>M=mB3#!vrp2A8EZlIZNFJ1q&17ncS+ZcHk5qH{rJ3Y9eJ*? zHrY%B^x?`>jOPeCVS`4->qjopEo>gh`Xbg57g~UdnkwJc; zo?3mG{p>TRViaz_O)wl0OEIpdp`3gy=KGkWc3{5BS!$_BD-8+q#ei5Nz6#uLr|WWe zld|xOqAuoe?x|zNZ=n@8-@H+*2<+DP)fmDEhWWv<;6Goe5nCoECeeg2>jb{op49DC z*K@v@l~f8ILuY#DmTG#-`txjXPaN}5^|@9z-G7`ezQe38dPg{oW%b%{ z#MR9^y|2eq-!^p)W-mD`nOKvbPOCkd1Kb7@u?cnHPBvL}jY_)BJRXjlh7SO<_vl<` z#o~tn*`x?PJ4^u7Z`4weXClg`4=Q1&FBuo(MuM+DA!@$hPE3(c-2^o>j=OS-j9}Mp zhd9|tUwp3pLn8MsoHK(EgV%If1bk@})3*4^C{v#2DDGi{DEYw&yInXUzBV2`MPI#M zeM5a{*?U44j=0(JjgSaT!DHJLxYn3{mlSaO&2Wu;DAB;M)5y6IZzVf|H)&V9-&R*Y zIHQ^nX;C@MW}AKJe6 z2-@21Y4m-<-8F>_-pT7j;1ZItg=3TgKFyzuK4d-KNZ@*A}0CF=PU+D zh-=r500*68@H9Vs`|*lA33e`%BcuNi;fw{%EkArWSvO!>)jdU($s_lV)TzC5qQ5 z@W{Ny%pkF{kH&l;7S(n~ZHqS5?A<4D+cduiL>4vh1S#y43U6we8a{AQi8PH9oh}_h z3sW%#5L8D{AlZ@EefPH13Pzp`0**%QZke27YMz|pRD=acgiEG`2kd=9T)IR zAcyxnbc7D+xg#Q?u^rbE^&&(nY?E=okG2vh(BRhQ2H>q0n6|EQIBU;g=`1N=0QAzM zX$}5Z(lMV|CjWRIiaN(oBI8=6*+;OE1c!J`w`}~;|A{e3KjJq~<$Hv~T0S14Hy5t! zvBO&5Z`juzsjPb~V+;z)0H6#(p-1H2%StM-DpMq6T zB*O+UQhtt}$d1-!u#AshD>S>PQBKF92417?*mQA9g$uxU2Co)J`2#0){Xgh1m3w?ugYuin|X=K@T6J7PE@z6PkKQ?KB>sr?)CLGG%zO zFm97qDN@!=2?r~p?;|P@t5(A-6yOH$lGJXjfWXOyH>f_7 zRK388JT7)5!iM0@RvbTQ22-Y|zbD0X(uUKW5-~Og&VRZAU=ea$>o&&hiGyPy`cegV z)s0l%>dX%2cT$^my_?HO>gYHx3AiiFEL`51EA}Nf=)SLPX%?Q0O@@X!?oKqRhPvU` z*~lCDAF7R{EFM6j7t)2(RU{yswdheoP@WM_)A z+>r)QClZicAveZ}V0`=bd>e_#4RV$Lb2vl>@H^>zibf&g+ea_>F{0n~hty5;zEQQO z^?g=Cqcd(_j$voKSZtPr;6FQE{sH_%B$iwTudo44bSNR@cD4>`t!-Ih+xok^RQ_US zs?{K%qQ@ZHz{z<*b)7^m?w_+E(wD!3JT7H~ZaeEyiQU`Rv*}HfSJEl4ME)BAb=Vo= zF#|#^>!!p5q2&rI2D9als#@yOUiTSUBf2uIQD~6+U_&TJ7X|7=UmoQJ0r7*Sit5K3 znT(CLM$sD5Uk|}aDu0J`E~-jXQNzb%0?5-fhf4#@V}m!X?gIHujb^}ERs!- zUFTZ zVwSmJ4h0Jj3x)S?h>{nWUS_=)@p1KBl%ciW;pWb-AAx10$-t4l&6Mpv#p%b^W$f)( zLA$xFZwtjN|mqW9of3cfiN5%K}&cuXRB#s zJYx>Fuk(l*W2SmIicfjQ!tmdZHV_*(v*w7XcEO;RO9CXZL!%HGZ4&pNnqv~Jo-fVi zg~fy=c$bUmjE)bk995{-qlz4Fs)@Jv0&ki%75ioJ;e;L@`Ep&TFk2W0CZ`@zyG&5{ zb0fODJ3CH{uN#l9FW47!hD?5l`(>yI(F;}tt0VT|?qfJ>-WLi>m6+;15i2cg;_J`YGGY$EpNLm%5$ zLLRQ9aMgTG$dz%tJ#U*`2mGRl?>|(>(}SaWrAla_81$=BxMY?}|jwN^CFwu6$sHC`Piz&spAqMGC}*8E(uUm!bV z^x(;RTjhfFBY}o~Q&+cQ2LzN1Wh3;EHoOlw)+k-P@&PuPqc!jrR1!6by34_fYO-Q^ z>t*acT~5VpwYM8wGpc!?TC&NqnFwe=rs|+z&I;>@(pQD@KpWHS0YG(w3*|z}3)ZWGRZ? z9}4to=Yuz!Tg}$(1q6Vrs#?$$a2zu?lA=e-L_Yhe58Bbz-)G#k+E>B4*9#LoZ~m*b zO~z7slQ1dA)xcg)yfv$=T?7Xk8}hm{gC%$Od0gd6Fj`5C=#gwbMdLEe!|cJ1Y7_lG zH*%}w$a1`fLKy?&;hx9uP1oP! zW%9r+burNc^VNHN@XedOHTZTtW8%l6{Kq; zEK8LG)$ficmW~Qs2qK~SzEXp}NBwm*8DKQ{1!I~N%tQTt`d#kw`m;mzu=+cz?g}ef zwoJ{vhn0~AHH+uuo>43|;-v}LPPUz=Xsfnn>?HzqsbJE9aZqoOo#-3fZ$v zLWUpl0tjCnZNG+_S+{?S`rRiQ+MIim>WqwJ%or9XGWD8NzElyy2?Hs*vZ-&3^uwd5z9aE{+jW{D86Gi6wPr#liSvbImIZT+@Yt~^>wh;q z2i|*zoNt(3?kZ6fQ9+m+SPR?6t-Uo=ifHA&?R6aqK@d*2Lo(Bf?9`Z#Dr!KCV7uRx zfznS_bH-)2)2g1SRk3?DFv}v33_oq&AFT?`6RX^cOWN^Hw4$tv9HT@)GP{9oREsZ( zN4bf8Ee{W~AM*Sb1bEb+$opMh@*07>(Bo7;$dhii42_C>9;3)@?d3(Li$V@#pejl5Db)J)za z_h{WBBIOO)9k0JE{y0y^eAu*nlemH6&hQ%xM6D<9!I*k8 z7GI1JI9HS^Aue=-Mbwv!{oPHycab&y(qG=iH-9|+@IlA6iC{POVUpF%%b?+}da&TS zW>${yCcaj@fu?bR^tkv(qf^2w_*GWL^`*(xGfTS1pCqfxytBJps}`9r5GD)m^MbdA zFILj-{OXyWwa)mR>o3H(k8|?%3(ELJr|>|&Cl_{-!+xDxWoL1X8GU^v(c*Ll0`l zTj3>6fG^L5D0Xq5OvTR`b8asW514aHz7^iqk*doM0sDSv2SrVe5z!jEh=btotJ=P2 zWV>B*7u}hepigUBeEit(Ajb4QJ#LO3j-N`EDFVeEu|9vc8}MFuZz7Q)o;L61(M@?% zG}0L{*gc_ajORkg74U_nZ2+4{;HMjtxo8dfA=ItIpN zF>iqyMG4o*(@$W6QM4AM+aZ=T<5nKUNaPs)yeC+VYjN$47U%to;QqftBL98`Pz}y|e>{BczmT^NWC(bP7-1g%m%p_5K+Xq% zCY&ap&;FMup9%3nvFrc667&E>#s8WZ{QrZ9{u*(P{`ONe?LU@^K}|DU;|?5m^fH>j zo{o8MqzjE=f@q0M^qG@8V_g7K=-h`YQ7*GX%g(xM3*`sSYOj6LgyMsjJYNPc^eeykJmPP#Yt_-i}_XCq?C{lrcEcu%fz~uT}P^%Fe zs!(ylo791coC!4+BtXwZAgO#;XH%DyR4HUHAYoxs4#XCJ*wjThw`ZE^d}BVnSPm4=CJYxV7PK(wx@dCKVd8*1dU9|8M!70btsmn zyuUacF0%~UG&xxy_LQ1#-6d*|MhH}*i2k%OJ+|Y+9ZcnG`S(X{642IAQH-S4<`?f) zcP0+IxrnCcQ%Vt4r5&XO&3r=)w2>eFgo@c0Fl)L1xR8$|F-+}7{%vG@&|W2s`K9Ud zRhjo^IZYf##Eq_00~q;#0w?=n6*t8{=>PNOi62ozXWJD6x3SfB?_X9$N!X`5@v^)* z@i!08@3P5nE9fJcHTQNS|90fo-)+`&$iJ=h_8KB@>Cy{rcl56!=C5!U&VY~iE+XjA zK!4a1da}%@Xre@cWP}66-@OuML$)i6kg6o#&a@*+3TQFV7DfhDWcZj>OtL(I8OrQ1 ztMVq;fEdj!2cqjRm9<3p7}VK>xXey7WqL2j-k-kxd*%o_0WVpE)y70Yk;MNpTKI!N z+{Yx3{4=6g>g2Xu?TKlDyr_$|43djqx_@V!`+Tp^+zDLlTxtllpbH0rq>q{I?=d9q z>HV8%K2dTvBn>TiXrIv>D|_efKpuYwB6RvV?CcAEBv0^Vp@EAYGoEMW9RMZJv%f8 z4vR`|lnu1z=ZNwx=oy0UB%gooi~KB{GPQS8dL+kE=PN>nY^Kh5hj%913zLazw2x1Q5?zS0$oCKeY~zzez4a+8MCULAtQ2c z?};uvEGM6Yf3@{i_au=yM))j;oRdoHtrZa^KVF=T<7_*5mFOE285^>>Fa zq~&_BV1q#y=H)D-BtfqbLrwpXh_6^E(j(8GDWP0>_<;>aDJb9jt;h}MCZmteA2zVH zQBrT9!H10{>anb&wWMOVWfmXM|*`7-B06m(}{d=K+SK^ZwM4&?Th#OmhZLpgoL$%;K zm-l8beW8NE&BHJGy;GrJPwI4UT1NMeu$++mZxEP{BHL@am}L?Q(a=1lAul-*tDx8K zoruri$Z5Fam%=&aL-8n@R1Ura^8;)jT!U!2ySB@bs*j+gB+`i|Yd%DLe@#SFNLieLbj*Uf1^=saAhprlR%G9Hz%ok2xp97`lIy`{6z(v6$ zy0qRGI7<}U(`KdG8DOm%D=5}dxn&PYmkks}Qol(z)lNrSi?Up}-Fv&xdMF${eENAD zG-D^2`{Fj71CY7z5}Lt=MdquE^?fQc$Ihk(LQcqjaX50S6nK0K{3fg-1tsFHUvJ5u(eX(6@B6D03gm1&9z@N%Wb?v{Iqt zt%&4P!G(H;Qy$vuO&Qnr%Dj5tGrbMZnwOUY;7QB!_4v%7_TK7qJqLB#74F=9ZN)GA z%em*S2&iLuxeOGd%pWA83;Mi+5$vu-^v}gaR|>t(dYF6-Xr$7gaYwSiK&iYf^xylr1VaFx)6eu#FlG$`}VJ!|pdd!`E-=~e~B zP%0H7AYV}f@F=9sJf){X3@7hijDo1Nvja|eSVZO;}S^DsNvWOQ|YqTNA^f zX1{uUM<&|`{gmlY zr-NjLtX9-XwV_rXxX{CW-Y_@3tJS=oHu2GOx(x2#lA;py*>lBr z4Qp``Rb~qAt$CNeKt7K|O%_Fy_W3R!I_(>KMD)bTNWp!FsOGEl?OH3dqsubRdr}G8 zW|eaEA;`ih6UC)%>$Ep9`y=F+ZS(|&^=9&5KFdaT$9kuABI{-Sf`!Gh?uVU;_{zoE z$n0<-&VOPJ0%fee<(twux9KXyxm@{bYwGGwD*YZ1kEuSG+Y=P7VB_o@pc|)Ixa=qu z>3NBmrwGX&O_bKyM{j^mSqrquJ&M{4zLci&aC#DRuPP||X45Up_c;F~70VUwdy|YS z={V5S&MykFn~`=Ll4_HtwFcOQFNe!*pVZYEjx_?^$y>Y44&5X|#88I!es3YV8TqCU<;<;N0@=V_wu(z!2AT!jU;YbQ zSqWs5@|$7?=(leS3UOU(b(BJMr)`08+?QP6iG`q||~@@KF8Z@{^wLv_-F z>O(R{!81MGb2tR572v&L)v}qKT_@*NuRkx zk3Z#*l3CVCYXEq=Mv5p%%rqU!HGGRJV~+J@E1o=p zDce@|YD#-co1QWQVMx_arGC40g&q)lXbqUV-Sz1~DMSRqk?An15v_U;rGrr?;aPZC z{hP8a0+GiRRjMRGzK|`ni_10&`~ny?(eDDHSq`7zr+(_y*s^q8{;5j7Xu0&VK&{K@ zP|H1AC41f}UI#B6K7C>;P3DvG4)&Ej!b*6uxJ#bw1D!0dBGc`bb^fD@T*F3%hiIk@ zZdTu+po0EA-IW zD$WWfe*x8h;05%*yuoBCa3?TV{v(=B`q9@7ABct4)X0;FKL!G3tAYOQ|KmvocAYi2 zEN5vn_{x+kH^>(HOKKho(?Ke{39t->X=vug%l1=2~<~(XB7-s z!rplx<1dxeqf$X_4;ug@h-HYbqqE-tezV3ZkIwhKCYx*x9rdff2^JO? zFx`1##vEQQO+OFED8od3ms1;MaI6xi4dBfP310nB2Rf1a80G4@H880h&luiUq;phJ zV*S)3B}o=Cgi;Uh)Uskvu^-k=ia@*R#P+3Sa;}cHA|3g+GN0M`?i_SNIez-uFh}L% zL|*N^0RQx5q@}u+Dwccer!N4W*tBUVFn3B;l!82dq0i2HtLK$TB zYcp#DYP;`oF8GR04|NmtUdAfwZ?!eSw9D8c!9f~Ig(&qC#dETq!D^tCn_UEJ4%Vdg zFU-xL0tMb3!e~_J;x;z~5=bSBzjVCKqqK>R?cM0A>n1$(=j2Qj^(ky^3YFZZ*>&u# z{1-;FSZ;39OQE-dnC3E?MecNpzu^3GU#LmJallsgI_)73$BuHH%d9V5B-4UOo693g zBCEQJebyoJHoR45cU-fhfP#<7eu~AqCHq(Ub>M{9jyZi{CV@os*CyR%*I_qfEA7t% z^W56p-Y)u3%uSI3Qca%xu3QG4@3E+Y?vQdfY-lKrd-k?w8t$4?r|F3+CnsBv*s2d& z4EOM}ja1(5w>ir}wWv=ZRq;bK(>j;PD}F-Yx1PMq7Ual47$=fvkIc~Vyo_$pjohRi z#(>2I@|ni%9xHuCAUeXA}abs9M^KD z)-$S2>odM58SL4F&-3@x+P?RU5Wtf-7J8NdcamvI7vTf!J>e9pV<-<`m$;j5CD-85 z#$ebLv-lR9VdJ=v{OdDp&Q=H5^?uH^QeQSTa@HCjFla1z_j+!_&)h&?3G%Ehe|UKB zXsL+RZ|a)xeLJ%yii9nvDe=w{|BdQ$lUuuA(BY}G;J6>dJUsM8uT!P*Y_}%?`|s+g z!0H`IV2WD(#9>q^V|?3pa@cp1pzdoJK8Kts#=LN|!_N00KlkXaG87eXk@oc7TbDgZ zg$; zcHr;t%|D^V^nORI>0L(2U($sAfRM02%_!?ovo$=nQZXsuUI!QQwRgG9^oyIrYbw5X zr?JH4kly`eki*Ce(t>4c0DQJRw{p2*r<$<<_gLlTtB3d4zAzfE^v+6>dCovg;zr&!rczvD-#XO0LP{)M}ZlTUGf zlSGqYP=gdmg*|GFqE>P48a=E<;qY{;KG(?SY0`J2%=lg}SKCS{j=^~fk7*wCEBlMM z_mxOVBDLj7U!bkejbeH=-5d+O)4%ZR%%+9p-dwCVQ73vrq34>_#KAQ;+|JbH*JLN+ zd!~jyfZgM*aMTU7PE5DZa!&m61S=qlmuqnJtrqDc{81t!bkBc%V?Cgih7u1WDjq7D zx6U`C-Or!neokDhz{f_NV(add1R-t%GuUaYNJ0il{!Y1tw<~O1Y*61{u{J)h*>ej+ zuT^2j+x9z?Fq=et9JoUvfYuOiFf`oCe|~}Zu0LM&RXbe5kxpkz(~zMr?PWp4J&Z#w zZ{Q?+`B{29ZPcnK2cF*^psA2y%iILidXh>7O?26j8b+8tenaIuY}M~l)m#*2xNdVQ z$X>=jRO1-+!7EU#lH2xqQPg8uf>TRR4qJ?U*GqSFk6HX3Qowayr{Fdx-$?cvydxPP zJ)s+c56=8g8YP?V7f2M&(?Kb7^f1UFEba;76)S3GHA2a|aQ^;V?0)wR_WiyOj!?HG zZ+c>f?GxX!rHZMbN=+{)(vb>=ErSmaZPX-x2bmHZ!(Fo|`-Xxjhf_;&lp81LqN=BeAe|{P1j@bZJGd zyF(rD(06a~jcs#9$fsVcYGyUOUmcP1B?k(F9t5dgQM*UQ#`?lKnzF4l~G-zBDx{Fm2_4)vQ1 zM{um{%J7NQZ@CYtF9COSc0E3+)Adn7$_%@o7(v?=UGpncOrOI&{ne0p88-WkAvK%d z#C;o5=p|`O7w%9VTdx{>>G($=5*RiYtjRT*iH1x(O`}W$Y!9jHpNaJ~3U$xmig}p5 z@-wnsBk0K`_=ds`D)k*;j#40zXk(IC0R>$n1%Q=jXGjH1CUSf>`f{& z2pbOn(#z#U%0FcjqxZQB+Ea0N`cGIyDU!DdN@buZt)y!rd_;)3#TwsRBtK0SmD$)F z=y%JLeUTrVBh2*C=qDXpPTU_5wCt*daN3OdL{+7|^{()h$XPaR2e?BLG*p=&waXVWOI8;SP!f`Lvs=!(67sZ5Bt#pY9fC=fA{TCIm*q9D7Yb%Hg_cfQt2 zPsUr5H)rF2nK-{27UG)1!#7bM>y@Z!QlmY^&vAK!?LO^P5VL=XZqp!NTCB|ww*6hI z{&I6V08aWta8vZOR3{Ze!@<=+m~35(DBJAapR)bL_8b*8gr!=r1|H#LAf~h!=D#8a zF3`+;+Fo1k0Vs&GWw3Qv6ScGNSnJXh)Q2DxmuKQe_4S=+@wG=X<2)obsN@SRILF!% zD&?0an^OU&`zOEHUAml2U9<;E10_YvH;^UEB5%a+BS$PC#Z+l(bwCKR&D0G3^iaNY zBjMLIh#EiN@Jed*GEWzK<7$m_ogSa^iiN4g|*sDVc~^TmaeO zmdhIRfyw+a#h6qo9P8tTo#rO`$$p%&Z?Q-Sf7kc)+3mH!OifD?*zlSpEOH&rj4_m0 zce*t$`rh#c&A747H1$_S-Lm>;&Z;fgAGk?ml$Jh(r|E(8MleBmt7Ruw>~i08J%ypP zhg}YsuMNB9{<0tfN`(5}k0zw$AF5{b${vGxcV`Hn*SY5e)HJ%*HymDm0Dhf_9&*Nn)G7|416%?w@>UOo;Y#+#N z5dg-=9O1|?*Nk;Q|JCN4+q=6>3x(~PYL4J*@dczF9$C%-#ie!s)#V0nUA?fDey^uF zEE)s`OJ{fjMFHdN#J=m4(B}_K0xZhR@MGLoa`AeaCh&>!`a`(ut-*u(Oc~XNzI>Cm zBfQ+2u~p~fzVu>xe4HaoGq5Ng6caK6roO~V7dR3wFYs>=V666kK(GCcl>cuGpf4>z zs1CU6vPK#GU>^ROxIyKw>HRSDM}z|BBM1WmI-L)W!)8@+=&v2OLO`maL%&$$Z%a1S zZ^pKu3Cr%=3@vMN)IZo_A+s^OS!1=O7~A(5QsbZXzdlA;Ar;&F$8!GqAX~6;j0ykE z>I!54>{Bs<|6>F;u&P6(hD($ipP%ilw_{H0IPtgW9YZn2rE>}>eO9is8Q4~yTWAF?wt{IZ)(0Y=U%xJLCH zZMA@$&LBdhflV(^s^0^*2Q}o5mXjS*l25aP)l_Vn$PeNP| zXA}=OOh1IVFf17QjfH$>3X^Do5xl^uj_6Z{7-eHgIV`$jZ2_BncQ_sbn$Ol-hKQIX z*P8Uv6logiAJX0}gq2Qs!$MhM36&JX=_6&6~UK95d_ig~r* z*kPV~vLRii#d1i?ivy8rXBQHLO0CL( zOpgxyT7-n;c2cV~<=l1MTbMn@Iz6mbBQ82A4v)(h_|-pPdi2i=Paz$axYgrt2o89&1LqZSmg3I+RFnXt%b<-oA2h ztS~k7FELL2tOWb~7>1;FT^QGT>rGOunH62d__p{SXf=m>^n_D!d|qj;DRQEV9TLPz zZzLauYnj;fm7M(*S?f;YSUQ2w1WvfCE$4Ts?o{J=fUGOtF`vhPW=%lbO*Lj{s9uIm z72wL)%i3Mc;G8^KtthG-vP^7xIw7XmTflFAQ)(q5B>$DP zy05vk07s)aVXYYbgDmhytRV+R(t3j-M+rLQwZ4`%c`V1YEMn?Q`^K-=dr_`$#g)?i zmI+_^M>Xa6#SXnFw_a84VKk@!|KuXg3wt|G(Ils^^e`#%*$)2#6wcTi>da( zdn~FkToMrfu9)E5XhGUT3Q<<&Y!y#4S00s1a!D1X38#0#7?Li;(3lcR;c^w}b~3SN zX2`2d7~CEP3;;GXM2WU6#cQAMovE0@*o^QsEYay?kMxZ)@!!>%2NGk8ef!kt;r&d*o;-?MVQ`eT}ev~1)N z|EnH&n23F#pZX(O1-{3p-LQHf}L>3 z6)>1g{$39*D{TA4!lwFy{q|f`3HgWR>6qAwMJFiMe_3bi}@OeBvJ zp>$@*WsTsQk!^wS)^d05Yy8g-^{q74hGLt6@j9?nw(EvgCYuFD$8d>Iz9Lw02x}cV(WPuHfQ=E*XEI~ zP!4cnNMHm|PA2af5yVP^yvHA|p1BE^Cwo6`7^9d-AGvq*1*^}=8E36FcHZMeZz`pU zVfyEr;5I`${<+}b1d8#yj{uJ146qQoWizX>*S3yL&Wc#G#k&W|^REWDfc^4UkL%?Q z>^-p*Q!X*|-p}7Yh0m?&O$9oWYmALp`dA? zsV@YRPy+)n6@=2Z{3@Uz*J{4@!VA2)5<1Wk%x;U zFfmc6g(0HiH`LNXhf2JRL<$L`?GX1ijxNXRGOa2tEZ*bz* zw>1C06WcIxr{q8^B?Vn{X-Z+T#K^ANdc1HSs@EV3>A(~d{TZ6k6;h8k^pj*{+5C%= z9c@PA($M8rk3-UR>L%Gt=K;d3HIZ15PQU3fd^*EnjF;an<5fkG_V%FgBOy`1m|g8F z8jKO>@Ix4Kg*0g;kaTV=4~9w@0BD=CGq~e&YM78h%pqH=C3bLStYKWv$3wA^7K&>q z5LOrC^-dAb?G8e!Rf^xIp4DmS9C$oZl6=HvB)(-|v^K7iXgMej!){uSRiXgP{BfPP zsFjPmk4^G{=FeFzFLg6$bw$Nv=lVk4>7az4-a{BmdlWuFaB%YfV@GvZU zZHsq~-unmX8(8iVC}_92Kzo?BVfL>vLr$b?PaYG22RU5RZ3WaSFV|2%tf@8CjdnxhMZto=7vt z>Mas`Q7ak`#Y#DcqR-Q!f#N(X<+S{Kyu%GarX^?8EY2}UCri+Mx_e-?NbYlvIC`}E zPn7jffamOQak_to!K4L$+>$3%k+`Qe|G=uOv;A&J9NksNg*)4VJsns=}g=zi5BiQww$7kIT#J)1`1lEK%$7&`l8+T zTRU_nGsU1cUdEguHeEKcHJ~Bt{Ni*R5K#5mwGr^zF;M4o+O?oPGN9gcLiv)i{iCST z|E4t-DY`6nJU(g(cOWCSi9_#fl(~70fWnoS>iSlI!3`b)^{~*UKLRP|v%N!{}BVRK*}C)~Y9>6`FC4BSzryfps)A2qdeGhlUWS{0wi5M=q&6(k=r zn^XOly!SPfK#jyoPjjoFo&T*c8zYF9`xB#0k}+#`J#NUir~$Riv0(w%7o&FXN44Lc zPz7MO68xQkr`UB=FnwbpzQ32_T#>ZinqbjM9lv|6Pe!wIEaF%sN@7ZH+P^r}LiD`8 z$UaNl7VU8+BwEFYXj4rafG^D%FUXK_IuL=$Ci|J9LSy41zJp*gx~}!U8Z9DC=gD#y zxFdfkoR9nad4&R%y;&v1SBl&b4W(Wo*!h0UT%YaRAKn6!8D^5y`v^$$8RR)to1?{9 zU~JmEGVy~aR%-K)<1WuQb8C3h=Xf$)zBrjQ9RWBlJ7aST?2K~t`N|nma?>^>^|`P8 z*iTw$Z(ruRg&o66gIXjcbp84Odyg0#+hgP3JoQr^DKZmINJtn-i8{Ds+m_pHC63g` z94YwFzf*EFxFDK~4<;eX0JjnIlQ>B5SYm>|E0X~0sD}L!_1Rc^-EVHTa zTY!2~yUVlS>wWpH{U31cF`lws;P4$UXitMD!462#S>XZzQi9GS(^FrqGy~RdGuDlq z&w+;e(!7z?=!IDw8c(0W(_&Ui&qtGv7i>&*7>`vhg&!9%rA|ia-;Br`o1K!;_X1qC zdx(21*?i6wslH&8zOZz<*{8d!pmK9= z*7=@|EkBM2w+N`#mXv_%Wzw|SI6Rbf-y8Q5=J~d)x3|JXi1m>@2dTz+8~z-4QEs!n zFo{-FgGR`zIdRyM^=uKiIPTkk3QC(}K-H z`6$mm|KR2MjtVQG=3$)oi0>RvyLff+F-!TPui9C%I3Ka;icAX|3UH{br5g^HkXLQO zg!3XHRaA3ff`Jp}QGS#>;r|?_kcO|iuXbsHE9vsZ&-6*~k{IqGc^o7=5yL<-q3_9C z$iN>|#}A|Y0(_8IF(6~{EI6Ju5}c3EskljD%7>ut5-&HLI71dR>pAx@l}XSMwAv@r+kMIphe(4!JA|bEU|{EBxL)RVpR)%?Ns!h)v#@cJT^_Q#7IQK z0h3x#;71L?)Wed(zl&Im_jTBdN)#>gq2YwoBPklJu)p|bGU9!5pw|nC@z$0=orF<% z@gxa3miP;Y{xcWfpJk6$o<6zhO;Yav{~i#f@NH$;cK99|=n z(yXH^(GjGMSzbhzER)ftcND~`VMuLGpp7R+DD?lhl9KJY?i$k?Vb86GN%j| zQD4Tw$n#O6Zq^BYBo>d7)4w;dE~+RNu2g?{-vLa{B-p#^FwM1hjXD+lgX|7pD^$Hq zufMp_S>0>0negv_hl_}})dzg@igd1E*Z5YPyz?teJu2&(;%Pu)I{BeDE<9VWJ-E=+ zv8cL$v*2B3#YGDYOcY&9Snx{D>-lzmkP?}n#~eFPbJ_Xi^}-$pi5vPKIIoHPt(6*7 zSe62Zsbw@OQh|h6e~8VDaVcoof4)GD`^_MNMD7Au!3TU*eu@0Lb|kSXJMPkRuaY7q z8p$bR5oA5MqwR&kBsGi~_i6YT`7K=CFuY3vORDn<| z!bamhE*B2P$pksVS&xM8+W_Hk#CW_x{$SOAq)CC85<-V+Dni;bGrO6Zn>ZHk`S6}_ z14uETCTs4McdDhO;>P0pqP6a+3WVj4S;)SFDXYC2#P%O~P$n?E^LS(22Q>4_AvT?i zGYn=&vMr<0bz1gXTVwQH-R@-RbSMk-4KOO&E%Nc-lbzY>Z7E^SdezMLEGU=@fP0!& znS^%Seca!zx6h*KQ@wa5+pnKwwqHp(OX^M|+2gW|#^<|Hv8T3+4xtc*Kb6dP1{+I% z>j^tcyEw4AvFi1pvr41c{nb_H0}ypN;yRJS8uU=wG_(?yBkEkTlW3?gBHN^IiWPIJ z{k+@XGRV>LiQj7Nbg~VJ80vGfk+WIg3%DNqI<<&9VU>|p$P0|3i{WWWMOB0tl!n+k zE}}f}3`+!1YS7qw38#60=;7(_36b0diJ5!g{j%7LCt4?)3b<3=8~P1j%1tV>zcfYV zzT=UR-H1rUp~YWr+uz^h7n}qLKNH~kNiDVs;*3w<`J_ePXC_0%Zs1ShD&@X#7Z|V% z&@V?2Qzqz!pOM_*qW=gs=;;B{06oHhbB_VCl~_!pw#@DN_e3`Qxb}2xJBMqoso0X& z!7MFAWW>?o3PF8!mR7jO#OP_HPs`X|ZSTIG`(W6A?1MMgH9gVk*;3HCW9n9uAV!5* z<-y1->R?IgRQ@QK%Ub^Qm-s?SVvU@@CJ`K@Sf;3zT#h6qJxetkL!`+`TP2@Ql`mj? zU7p=+L*OEEK~#DfXk`WPv1L4Kd2YTxTNQuN^?a;pSW5Ra9Ut{l%K$j;Wohu#+XuU_ zyW@7MGw6+c(?6O^mM(9g@eHA-t^PG|x9ysr6sDO0jYI&71Vw`Ig3NL8SnB9;YqxC% zaRg{ID5{hYb1gFL9q$;Fo&laN!>8oeFbr6WJ_d!%DuA`ZOO&C0^WH3G$*<&4th1lV z*w~Y~R*;ViX0PaIEcD0w{=8;6@py2>c{|^vawmAD7+7IivmTVxgw?V8`8f}~jGU@} zMNNKYLrH2_x7WxLVZoA;`Nzpa>`6WPdEa=z*BiLs#H7x0wUzPVn1YnnMaa1%6~gzd zIQ$pLEF3?}q2awCVttJWupY>hY<-%Bgu!wkE?8 zA@%x(c8b(hn(-o2X~h~}6yN)(t$9;SgD>KkOuPBMSpgNnP()QV(r;xGmW_&AcsS?E z`STo1Lrv`FsJ2{7{=2#m^Q+U9E@d@Eptr2qy0-MU)g(_f<-;cGSvM&#kDGSw+xcr2TJn1lTSt4Y7aMy7+SEu7wwx?r1y#~e;!E$ zf$pON-FD(Wi_e(uvu>zFMNKAW(O8Wx<*xSHNufyYsj=x^`kubzXhc;>>m!g9W|$Mv zYo`rE^R_n9#1~e*=>~xn#q{MdNaPf~g;H0#a2H$-j}e8d!HKe*Ol8R|Sb}(&@O6X2yeV_#>&!1KVfR$av16FyqW4P_(VG zGgb z2YHan1*l;fAt+Mw0F+Dw(IrEJiQ)H4)kiO6UhA*z@8gu(rPT_&sab!zL|=s=Yo}}B zk?Za^;MnTi)3dAb&OPuqHN z201wLWPis8$!-Gjxv?0F7Do$K7p^V}^6(mTxN7cJEhfHT3nMGXvrG7apJ9R_pZ!FY z84n_XHq_F(V#!%=!shgupiIwM;=Yki{*@u@uko$=ec1euC^`U*xYyRZj>Mpv>Yj#< zvuETBA=(g|tUU*v_Knq#P%8AJ9CNwy)+bCCwoO&}0n)*X`{Raz zO>Ng08ytTJqJ1R(SByR3ieIzb7ll;mC>3ZrVEwdR8wN|&dLSfNQdsh zz&2aCp}%d%iH0~^N?akFc=91PG5OqiIZ!F z_{J*S9N*#P&*7$JLb!}ZGxoQ;QMpV)ho>r=3l8Z9>H=H+`cT#D^uc40TAySRK%iH! z!Ido^BEO-%tMl*tpwZz8d=u=uAsEM92_Np#5y%97p<3Rf_(>*X@VY z;Y*BY9^OkuF{<{BG#CtjVg^#AIH}XKTLH`7YIj5)liK&LFLf`q4@Qs4@_cNzzRKgZ z)73XoB(pg+y*j&dld|o4&M4M_l4+>;p@ON%O`14n7L~%ML;U$tLKIi3e0eSPnrFg> zBb3^&gUjq{Ga6YnwxV7I4R%eC+1Az%wo1f&rNGlheEGoc115+)WAtFjdX{`KQ)`?( zxMpUQgR!U2;;v!Vd|p$VXOC7RTaM=;Q?z%`>ArOM({B45FNm5Q$GvZEZ<4y%g*O^b zi}AcEdzcUaMoKIh3Gm>m?~dK>52#B$zFj*2Qu#t(!tErneVZu#!6gWW!9BFrU=RF# z+2EQv@1joFoCZOO0$+hEC(6A@aA5aEZ}FK?4l^7NVJ=OGy;Lk1XMep|hRV>K;R_uY z$>`IPsn{;%gA@O$5U@iV$+Jgo{l`dXEhW`%+tjl`Z(|%wS!FJ$l;&(8;@)qZm-9K^ zx;A%>7_!z4RR_?pd{TBeriE_(>ovQiU-DPx{c#e(CSi&hbRya!T@@^VJZO=SpP7>} zPmX6TN-YBCKs_VZynT%4<8^d{lBqQx2|{VZjUVNpjEqpY>Z!ThosyGDaUWcLfOC0q zLU&O56RiBpQbzA5>bmEd24{k3fNYNr8a30kLx8Mlv5eQ@?t0!2vrmdF6AJ{C&|95Z z-)RV(rSD&%M)ok99!RNtwgGNWWi{JA09#g6%F+qs#cI*X-h^0ja?1Kueuhj2Pm=+q zK?ON2Hr*kYoz&C*yBY}m12dXopoPCWq<^uufm)mT?y}xIs~cA?a?w$pb@JUrHYGT8 z&LM2=rlCY;?a>W{1kHhNB`k+sbv$=4Vh;5$bb2z626iaw+1Dkv&Ore@OLM69fj5av zhjKIYYmuB8rFiXdTS0;aH$Q71946j*d*9C{KRHZG_l>O5Djasy8^*IGDq3$2U<*bN z32WReOt+gRiBfRo$IddY$KSJhHtw5cKwJCu0DX;NfPm*IHt2Sm{!9wlvei$a$EZ`O zIOqkEVI!Q(wgRsN#hHPVYKxRcYa_FD8b+E%d$A^Jrs)AnBbt=~uD!a3el8LLusUJ= z09mcNPa(uWKMLH_F)%@?65{O*f#?R<_GbVujwOnJ@4L;;r+y}VS&w8mk8A=ueF^;~ z#Iy$91clhyjNqRT{SFZ|CrZmHp0Q^5KM_&#aO^MllQlUdB7xF7-9&qgC+Hk!xj<>f_z&g99!g%{>_h>Z2tR3he0A3{d$P zKMWI0nS}A0iWA{)>npJ1ft_guaBva?X7Ex8!#x!Tg1;?XV8^M=an+BN5|}{A$M=m^ z>{P8kUBBPl8;QZ1w( G@IL_ZhW#=C diff --git a/1-js/9-prototypes/5-class-inheritance/console_dir_array.png b/1-js/9-prototypes/5-class-inheritance/console_dir_array.png deleted file mode 100755 index a58db646db054f081045904257e9524962bb0628..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17005 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 OHS*r)=UMx6c;?^BGc@G@ diff --git a/1-js/9-prototypes/6-instanceof/1-strange-instanceof/solution.md b/1-js/9-prototypes/6-instanceof/1-strange-instanceof/solution.md deleted file mode 100644 index 6bf55d43..00000000 --- a/1-js/9-prototypes/6-instanceof/1-strange-instanceof/solution.md +++ /dev/null @@ -1,7 +0,0 @@ -Да, это выглядит достаточно странно, поскольку объект `a` не создавался функцией `B`. - -Но методу `instanceof` на самом деле вообще не важна функция. Он смотрит на её `prototype` и сверяет его с цепочкой `__proto__` объекта. - -В данном случае `a.__proto__ == B.prototype`, поэтому `instanceof` возвращает `true`. - -По логике `instanceof` именно прототип задаёт "тип объекта", поэтому `instanceof` работает именно так. \ No newline at end of file diff --git a/1-js/9-prototypes/6-instanceof/1-strange-instanceof/task.md b/1-js/9-prototypes/6-instanceof/1-strange-instanceof/task.md deleted file mode 100644 index a3c73f74..00000000 --- a/1-js/9-prototypes/6-instanceof/1-strange-instanceof/task.md +++ /dev/null @@ -1,21 +0,0 @@ -# Странное поведение instanceof - -[importance 5] - -Почему `instanceof` в коде ниже возвращает `true`, ведь объект `a` явно создан не `B()`? - -```js -//+ run -function A() {} - -function B() {} - -A.prototype = B.prototype = {}; - -var a = new A(); - -*!* -alert( a instanceof B ); // true -*/!* -``` - diff --git a/1-js/9-prototypes/6-instanceof/2-instanceof-result/solution.md b/1-js/9-prototypes/6-instanceof/2-instanceof-result/solution.md deleted file mode 100644 index 646e3aa1..00000000 --- a/1-js/9-prototypes/6-instanceof/2-instanceof-result/solution.md +++ /dev/null @@ -1,18 +0,0 @@ -Да, распознает. - -Он проверяет наследование с учётом цепочки прототипов. - -```js -//+ run -function Animal() {} - -function Rabbit() {} -Rabbit.prototype = Object.create(Animal.prototype); - -var rabbit = new Rabbit(); - -alert( rabbit instanceof Rabbit ); // true -alert( rabbit instanceof Animal ); // true -alert( rabbit instanceof Object ); // true -``` - diff --git a/1-js/9-prototypes/6-instanceof/2-instanceof-result/task.md b/1-js/9-prototypes/6-instanceof/2-instanceof-result/task.md deleted file mode 100644 index 56c971e4..00000000 --- a/1-js/9-prototypes/6-instanceof/2-instanceof-result/task.md +++ /dev/null @@ -1,23 +0,0 @@ -# Что выведет instanceof? - -[importance 5] - -В коде ниже создаётся простейшая иерархия классов: `Animal -> Rabbit`. - -Что выведет [instanceof](/instanceof)? - -Распознает ли он `rabbit` как `Animal`, `Rabbit` и к тому же `Object`? - -```js -function Animal() {} - -function Rabbit() {} -Rabbit.prototype = Object.create(Animal.prototype); - -var rabbit = new Rabbit(); - -alert( rabbit instanceof Rabbit ); -alert( rabbit instanceof Animal ); -alert( rabbit instanceof Object ); -``` - diff --git a/1-js/9-prototypes/6-instanceof/article.md b/1-js/9-prototypes/6-instanceof/article.md deleted file mode 100644 index 174333cf..00000000 --- a/1-js/9-prototypes/6-instanceof/article.md +++ /dev/null @@ -1,91 +0,0 @@ -# Проверка класса: "instanceof" - -Оператор `instanceof` позволяет проверить, какому классу принадлежит объект, с учетом прототипного наследования. - -[cut] - -## Алгоритм работы instanceof [#ref-instanceof] - -Вызов `obj instanceof Constructor` возвращает `true`, если объект принадлежит классу `Constructor` или его родителям. - -Пример использования: - -```js -//+ run -function Rabbit() {} - -*!* -// создаём объект -*/!* -var rabbit = new Rabbit(); - -// проверяем -- этот объект создан Rabbit? -*!* -alert( rabbit instanceof Rabbit ); // true, верно -*/!* -``` - -Массив `arr` принадлежит классу `Array`, но также и является объектом `Object`. Это верно, так как массивы наследуют от объектов: - -```js -//+ run -var arr = []; -alert( arr instanceof Array ); // true -alert( arr instanceof Object ); // true -``` - -Как это часто бывает в JavaScript, здесь есть ряд тонкостей. В некоторых ситуациях, проверка может даже ошибаться! - -**Алгоритм проверки `obj instanceof Constructor`:** - -

      -
    1. Получить `obj.__proto__`
    2. -
    3. Сравнить `obj.__proto__` с `Constructor.prototype`
    4. -
    5. Если не совпадает, тогда заменить `obj` на `obj.__proto__` и повторить проверку на шаге 2 до тех пор, пока либо не найдется совпадение (результат `true`), либо цепочка прототипов не закончится (результат `false`).
    6. -
    - -В проверке `rabbit instanceof Rabbit` совпадение происходит на первом же шаге этого алгоритма, так как: `rabbit.__proto__ == Rabbit.prototype`. - -А если рассмотреть `arr instanceof Object`, то совпадение будет найдено на следующем шаге, так как `arr.__proto__.__proto__ == Object.prototype`. - -Забавно, что сама функция-констуктор не участвует в процессе проверки! Важна только цепочка прототипов для проверяемого объекта. - -Это может приводить к забавному результату и даже ошибкам в проверке при изменении `prototype`, например: - -```js -//+ run -// Создаём объект rabbit, как обычно -function Rabbit() {} -var rabbit = new Rabbit(); - -// изменили prototype... -Rabbit.prototype = {}; - -// ...instanceof перестал работать! -*!* -alert( rabbit instanceof Rabbit ); // false -*/!* -``` - -Стоит ли говорить, что это один из доводов для того, чтобы никогда не менять `prototype`? Так сказать, во избежание. - -[warn header="Не друзья: `instanceof` и фреймы"] - -Оператор `instanceof` не срабатывает, когда значение приходит из другого окна или фрейма. - -Например, массив, который создан в ифрейме и передан родительскому окну -- будет массивом *в том ифрейме*, но не в родительском окне. Проверка `instanceof Array` в родительском окне вернёт `false`. - -Вообще, у каждого окна и фрейма -- своя иерархия объектов и свой `window` . - -Как правило, эта проблема возникает со встроенными объектами, в этом случае используется проверка внутреннего свойства `[[Class]]`, которое подробнее описано в главе [](/class-instanceof). -[/warn] - - -## Итого - -
      -
    • Оператор `obj instanceof Func` проверяет тот факт, что `obj` является результатом вызова `new Func`. Он учитывает цепочку `__proto__`, поэтому наследование поддерживается.
    • -
    • Оператор `instanceof` не сможет проверить тип значения, если объект создан в одном окне/фрейме, а проверяется в другом. Это потому, что в каждом окне -- своя иерархия объектов. Для точной проверки типов встроенных объектов можно использовать свойство `[[Class]]`.
    • -
    - -Оператор `instanceof` особенно востребован в случаях, когда мы работаем с иерархиями классов. Это наилучший способ проверить принадлежность тому или иному классу с учётом наследования. diff --git a/1-js/9-prototypes/7-oop-errors/1-format-error/solution.md b/1-js/9-prototypes/7-oop-errors/1-format-error/solution.md deleted file mode 100644 index 1532bd3c..00000000 --- a/1-js/9-prototypes/7-oop-errors/1-format-error/solution.md +++ /dev/null @@ -1,28 +0,0 @@ -```js -//+ run -function FormatError(message) { - this.name = "FormatError"; - - this.message = message; - - if (Error.captureStackTrace) { - Error.captureStackTrace(this, this.constructor); - } else { - this.stack = (new Error()).stack; - } - -} - -FormatError.prototype = Object.create(SyntaxError.prototype); -FormatError.prototype.constructor = FormatError; - -// Использование - -var err = new FormatError("ошибка форматирования"); - -alert( err.message ); // ошибка форматирования -alert( err.name ); // FormatError -alert( err.stack ); // стек на момент генерации ошибки - -alert( err instanceof SyntaxError ); // true -``` \ No newline at end of file diff --git a/1-js/9-prototypes/7-oop-errors/1-format-error/task.md b/1-js/9-prototypes/7-oop-errors/1-format-error/task.md deleted file mode 100644 index bd78ad35..00000000 --- a/1-js/9-prototypes/7-oop-errors/1-format-error/task.md +++ /dev/null @@ -1,17 +0,0 @@ -# Унаследуйте от SyntaxError - -[importance 5] - -Создайте ошибку `FormatError`, которая будет наследовать от встроенного класса `SyntaxError`. - -Синтаксис для её создания -- такой же, как обычно: - -```js -var err = new FormatError("ошибка форматирования"); - -alert( err.message ); // ошибка форматирования -alert( err.name ); // FormatError -alert( err.stack ); // стек на момент генерации ошибки - -alert( err instanceof SyntaxError ); // true -``` diff --git a/1-js/9-prototypes/7-oop-errors/article.md b/1-js/9-prototypes/7-oop-errors/article.md deleted file mode 100644 index 13fd9715..00000000 --- a/1-js/9-prototypes/7-oop-errors/article.md +++ /dev/null @@ -1,285 +0,0 @@ -# Свои ошибки, наследование от Error - -Когда мы работаем с внешними данными, возможны самые разные ошибки. - -Если приложение сложное, то ошибки естественным образом укладываются в иерархию, разобраться в которой помогает `instanceof`. - -## Свой объект ошибки - -Для примера создадим функцию `readUser(json)`, которая будет разбирать JSON с данными посетителя. Мы его получаем с сервера -- может, нашего, а может -- чужого, в общем -- желательно проверить на ошибки. А может, это даже и не JSON, а какие-то другие данные -- не важно, для наглядности поработаем с JSON. - -Пример `json` на входе в функцию: `{ "name": "Вася", "age": 30 }`. - -В процессе работы `readUser` возможны различные ошибки. Одна -- очевидно, `SyntaxError` -- если передан некорректный JSON. - -Но могут быть и другие, например `PropertyError` -- эта ошибка будет возникать, если в прочитанном объекте нет свойства `name` или `age`. - -Реализуем класс `PropertyError`: - -```js -function PropertyError(property) { - Error.call(this, property) ; - this.name = "PropertyError"; - - this.property = property; - this.message = "Ошибка в свойстве " + property; - - if (Error.captureStackTrace) { - Error.captureStackTrace(this, PropertyError); - } else { - this.stack = (new Error()).stack; - } - -} - -PropertyError.prototype = Object.create(Error.prototype); -``` - -В этом коде вы можете видеть ряд важных деталей, важных именно для ошибок: - -
    -
    `name` -- имя ошибки.
    -
    Должно совпадать с именем функции.
    -
    `message` -- сообщение об ошибке.
    -
    Несмотря на то, что `PropertyError` наследует от `Error` (последняя строка), конструктор у неё немного другой. Он принимает не сообщение об ошибке, а название свойства `property`, ну а сообщение генерируется из него. - -В результате в объекте ошибки есть как стандартное свойство `message`, так и более точное `property`. - -Это частая практика -- добавлять в объект ошибки свойства, которых нет в базовых объектах `Error`, более подробно описывающие ситуацию для данного класса ошибок.
    -
    `stack` -- стек вызовов, которые в итоге привели к ошибке.
    -
    У встроенных объектов `Error` это свойство есть автоматически, вот к примеру: -```js -//+ run -function f() { - alert( new Error().stack ); -} - -f(); // выведет список вложенных вызовов, с номерами строк, где они были сделаны -``` - -Если же объект ошибки делаем мы, то "по умолчанию" у него такого свойства у него не будет. Нам нужно как-то самим узнавать последовательность вложенных вызовов на текущий момент. Однако удобного способа сделать это в JavaScript нет, поэтому мы поступаем хитро и копируем его из нового объекта `new Error`, который генерируем тут же. - -В V8 (Chrome, Opera, Node.JS) есть нестандартное расширение [Error.captureStackTrace](https://code.google.com/p/v8-wiki/wiki/JavaScriptStackTraceApi), которое позволяет стек получать. - -Это делает строка из кода выше: -```js -Error.captureStackTrace(this, PropertyError); -``` - -Такой вызов записывает в объект `this` (текущий объект ошибки) стек вызовов, ну а второй аргумент -- вообще не обязателен, но если есть, то говорит, что при генерации стека нужно на этой функции остановиться. В результате в стеке будет информация о цепочке вложенных вызовов вплоть до вызова `PropertyError`. - -То есть, будет последовательность вызовов до генерации ошибки, но не включая код самого конструктора ошибки, который, как правило, не интересен. Такое поведение максимально соответствует встроенным ошибкам JavaScript. -
    -
    - -[smart header="Конструктор родителя здесь не обязателен"] -Обычно, когда мы наследуем, то вызываем конструктор родителя. В данном случае вызов выглядит как `Error.call(this, message)`. - -Строго говоря, этот вызов здесь не обязателен. Встроенный конструктор `Error` ничего полезного не делает, даже свойство `this.message` (не говоря уже об `name` и `stack`) не назначает. Единственный возможный смысл его вызова -- он ставит специальное внутреннее свойство `[[ErrorData]]`, которое выводится в `toString` и позволяет увидить, что это ошибка. Поэтому по стандарту вызывать конструктор `Error` при наследовании в таких случаях рекомендовано. -[/smart] - - -## instanceof + try..catch = ♡ - -Давайте теперь используем наш новый класс для `readUser`: - -```js -//+ run -*!* -// Объявление -*/!* -function PropertyError(property) { - this.name = "PropertyError"; - - this.property = property; - this.message = "Ошибка в свойстве " + property; - - if (Error.captureStackTrace) { - Error.captureStackTrace(this, PropertyError); - } else { - this.stack = (new Error()).stack; - } - -} - -PropertyError.prototype = Object.create(Error.prototype); - -*!* -// Генерация ошибки -*/!* -function readUser(data) { - - var user = JSON.parse(data); - - if (!user.age) { - throw new PropertyError("age"); - } - - if (!user.name) { - throw new PropertyError("name"); - } - - return user; -} - -*!* -// Запуск и try..catch -*/!* - -try { - var user = readUser('{ "age": 25 }'); -} catch (err) { - if (err instanceof PropertyError) { - if (err.property == 'name') { - // если в данном месте кода возможны анонимы, то всё нормально -*!* - alert( "Здравствуйте, Аноним!" ); -*/!* - } else { - alert( err.message ); // Ошибка в свойстве ... - } - } else if (err instanceof SyntaxError) { - alert( "Ошибка в синтаксисе данных: " + err.message ); - } else { - throw err; // неизвестная ошибка, не знаю что с ней делать - } -} -``` - -Всё работает -- и наша ошибка `PropertyError` и встроенная `SyntaxError` корректно генерируются, перехватываются, обрабатываются. - -Обратим внимание на проверку типа ошибки в `try..catch`. Оператор `instanceof` проверяет класс с учётом наследования. Это значит, что если мы в дальнейшем решим создать новый тип ошибки, наследующий от `PropertyError`, то проверка `err instanceof PropertyError` для класса-наследника тоже будет работать. Код получился расширяемым, это очень важно. - -## Дальнейшее наследование - -`PropertyError` -- это просто общего вида ошибка в свойстве. Создадим ошибку `PropertyRequiredError`, которая означает, что свойства нет. - -Эт подвид `PropertyError`, так что унаследуем он неё. Общий вид конструктора-наследника -- стандартный: - -```js -function PropertyRequiredError(property) { - // вызываем конструктор родителя и передаём текущие аргументы - PropertyError.apply(this, arguments); - ... -} -``` - -Достаточно ли в наследнике просто вызвать конструктор родителя? Увы, нет. - -Если так поступить, то свойство `this.name` будет некорректным, да и `Error.captureStackTrace` тоже получит неправильную функцию вторым параметром. - -Можно ли как-то поправить конструктор родителя, чтобы от него было проще наследовать? - -Для этого нужно убрать из него упоминания о конкретном классе `PropertyError`, чтобы сделать код универсальным. Частично -- это возможно. Как мы помним, существует свойство `constructor`, которое есть в `prototype` по умолчанию, и которое мы можем намеренно сохранить при наследовании. - -Исправим родителя `PropertyError` для более удобного наследования от него: - -```js -function PropertyError(property) { - this.name = "PropertyError"; - - this.property = property; - this.message = "Ошибка в свойстве " + property; - - if (Error.captureStackTrace) { - Error.captureStackTrace(this, *!*this.constructor*/!*); // (*) - } else { - this.stack = (new Error()).stack; - } - -} - -PropertyError.prototype = Object.create(Error.prototype); -*!* -PropertyError.prototype.constructor = PropertyError; -*/!* -``` - -В строке `(*)` вместо ссылки на `PropertyError` используем `constructor` чтобы получить именно конструктор для текущего объекта. В наследнике там будет `PropertyRequiredError`, как и задумано. - -Мы убрали одну жёсткую привязку к `PropertyError`, но со второй (`this.name`), увы, сложности. Оно должно содержать имя ошибки, то есть, имя её функции-конструктора. Его можно получить через `this.name = this.constructor.name`, но в IE11- это работать не будет. - -Если подерживать IE11-, то тут уж придётся в наследнике его записывать вручную. - -Полный код для наследника: - -```js -function PropertyRequiredError(property) { - PropertyError.apply(this, arguments); - this.name = 'PropertyRequiredError'; - this.message = 'Отсутствует свойство ' + property; -} - -PropertyRequiredError.prototype = Object.create(PropertyError.prototype); -PropertyRequiredError.prototype.constructor = PropertyRequiredError; - -var err = new PropertyRequiredError("age"); -// пройдёт проверку -alert( err instanceof PropertyError ); // true -``` - -Здесь заодно и `message` в наследнике было перезаписано на более точное. Если хочется избежать записи и перезаписи, то можно оформить его в виде геттера через `Object.defineProperty`. - -## Итого - -
      -
    • Чтобы наследовать от ошибок `Error`, нужно самостоятельно позаботиться о `name`, `message` и `stack`.
    • -
    • Благодаря тому, что `instanceof` поддерживает наследование, удобно организуются проверки на нужный тип. В иерархию ошибок можно в любой момент добавить новые классы, с понятным кодом и предсказуемым поведением.
    • -
    - -Чтобы создавать наследники от `Error` было проще, можно создать класс `CustomError`, записать в него универсальный код, наподобие `PropertyError` и далее наследовать уже от него: - -```js -*!* -// общего вида "наша" ошибка -*/!* -function CustomError(message) { - this.name = "CustomError"; - this.message = message; - - if (Error.captureStackTrace) { - Error.captureStackTrace(this, this.constructor); - } else { - this.stack = (new Error()).stack; - } - -} - -CustomError.prototype = Object.create(Error.prototype); -CustomError.prototype.constructor = CustomError; - -*!* -// наследник -*/!* -function PropertyError(property) { - CustomError.call(this, "Отсутствует свойство " + property) - this.name = "PropertyError"; - - this.property = property; -} - -PropertyError.prototype = Object.create(CustomError.prototype); -PropertyError.prototype.constructor = PropertyError; - -*!* -// и ещё уровень -*/!* -function PropertyRequiredError(property) { - PropertyError.call(this, property); - this.name = 'PropertyRequiredError'; - this.message = 'Отсутствует свойство ' + property; -} - -PropertyRequiredError.prototype = Object.create(PropertyError.prototype); -PropertyRequiredError.prototype.constructor = PropertyRequiredError; - -*!* -// использование -*/!* -var err = new PropertyRequiredError("age"); -// пройдёт проверку -alert( err instanceof PropertyRequiredError ); // true -alert( err instanceof PropertyError ); // true -alert( err isntanceof CustomError ); // true -alert( err isntanceof Error ); // true -``` diff --git a/1-js/9-prototypes/8-mixins/article.md b/1-js/9-prototypes/8-mixins/article.md deleted file mode 100644 index a87d1bf3..00000000 --- a/1-js/9-prototypes/8-mixins/article.md +++ /dev/null @@ -1,170 +0,0 @@ -# Примеси - -В JavaScript невозможно унаследовать от двух и более объектов. Ссылка `__proto__` -- только одна. - -Но потребность такая существует -- к примеру, мы написали код, релизующий методы работы с шаблонизатором или методы по обмену событиями, и хочется легко и непринуждённо добавлять эти возможности к любому классу. - -Обычно это делают через примеси. - -Примесь (англ. mixin) -- класс или объект, реализующий какое-либо чётко выделенное поведение. Используется для уточнения поведения других классов, не предназначен для самостоятельного использования. - - - -## Пример примеси - -Самый простой вариант примеси -- это объект с полезными методами, которые мы просто копируем в нужный прототип. - -Например: - -```js -//+ run -*!* -// примесь -*/!* -var sayHiMixin = { - sayHi: function() { - alert("Привет " + this.name); - }, - sayBye: function() { - alert("Пока " + this.name); - } -}; - -*!* -// использование: -*/!* -function User(name) { - this.name = name; -} - -// передать методы примеси -for(var key in sayHiMixin) User.prototype[key] = sayHiMixin[key]; - -// User "умеет" sayHi -new User("Вася").sayHi(); // Привет Вася -``` - -Как видно из примера, методы примеси активно используют `this` и предназначены именно для запуска в контексте "объекта-носителя примеси". - -Если какие-то из методов примеси не нужны -- их можно перезаписать своими после копирования. - - -## Примесь для событий - -Теперь пример из реальной жизни. - -Важный аспект, который может понадобиться объектам -- это умение работать с событиями. - -То есть, чтобы объект мог специальным вызовом генерировать "уведомление о событии", а на эти уведомления другие объекты могли "подписываться", чтобы их получать. - -Например, объект "Пользователь" при входе на сайт может генерировать событие `"login"`, а другие объекты, например "Календарь" может такие уведомления получать и подгружать информацию о пользователе. - -Или объект "Меню" может при выборе пункта меню генерировать событие `"select"` с информацией о выбранном пункте меню, а другие объекты -- подписавшись на это событие, будут узнавать об этом. - -События -- это средство "поделиться информацией" с неопределённым кругом заинтересованных лиц. А там уже кому надо -- тот среагирует. - -Примесь `eventMixin`, реализующая события: - -```js -var eventMixin = { - - /** - * Подписка на событие - * Использование: - * menu.on('select', function(item) { ... } - */ - on: function(eventName, handler) { - if (!this._eventHandlers) this._eventHandlers = {}; - if (!this._eventHandlers[eventName]) { - this._eventHandlers[eventName] = []; - } - this._eventHandlers[eventName].push(handler); - }, - - /** - * Прекращение подписки - * menu.off('select', handler) - */ - off: function(eventName, handler) { - var handlers = this._eventHandlers && this._eventHandlers[eventName]; - if (!handlers) return; - for(var i=0; i -
  • `.on(имя события, функция)` -- назначает функцию к выполнению при наступлении события с данным именем. Такие функции хранятся в защищённом свойстве объекта `_eventHandlers`.
  • -
  • `.off(имя события, функция)` -- удаляет функцию из списка предназначенных к выполнению.
  • -
  • `.trigger(имя события, аргументы)` -- генерирует событие, при этом вызываются все назначенные на него функции, и им передаются аргументы.
  • - - -Использование: - -```js -// Класс Menu с примесью eventMixin -function Menu() { - // ... -} - -for(var key in eventMixin) { - Menu.prototype[key] = eventMixin[key]; -} - -// Генерирует событие select при выборе значения -Menu.prototype.choose = function(value) { -*!* - this.trigger("select", value); -*/!* -} - -// Создадим меню -var menu = new Menu(); - -// При наступлении события select вызвать эту функцию -*!* -menu.on("select", function(value) { - alert("Выбрано значение " + value); -}); -*/!* - -// Запускаем выбор (событие select вызовет обработчики) -menu.choose("123"); -``` - -...То есть, смысл событий -- обычно в том, что объект, в процессе своей деятельности, внутри себя (`this.trigger`) генерирует уведомления, на которые внешний код через `menu.on(...)` может быть подписан. И узнавать из них ценную информцию о происходящем, например -- что выбран некий пункт меню. - -Один раз написав методы `on/off/trigger` в примеси, мы затем можем использовать их во множестве прототипов. - -## Итого - -
      -
    • Примесь -- объект, содержащий методы и свойства для реализации конкретного функционала. -Возможны вариации этого приёма проектирования. Например, примесь может предусматривать конструктор, который должен запускаться в конструкторе объекта. Но как правило просто набора методов хватает.
    • -
    • Для добавления примеси в класс -- её просто "подмешивают" в прототип.
    • -
    • "Подмешать" можно сколько угодно примесей, но если имена методов в разных примесях совпадают, то возможны конфликты. Их уже разрешать -- разработчику. Например, можно заменить конфликтующий метод на свой, который будет решать несколько задач сразу. Конфликты при грамотно оформленных примесях возникают редко.
    - - diff --git a/1-js/9-prototypes/index.md b/1-js/9-prototypes/index.md deleted file mode 100644 index 3b67318e..00000000 --- a/1-js/9-prototypes/index.md +++ /dev/null @@ -1,3 +0,0 @@ -# ООП в прототипном стиле - -В этом разделе мы изучим прототипы и классы на них -- де-факто стандарт объектно-ориентированной разработки в JavaScript. \ No newline at end of file diff --git a/10-regular-expressions-javascript/1-regexp-introduction/article.md b/10-regular-expressions-javascript/1-regexp-introduction/article.md deleted file mode 100644 index 3fb0195a..00000000 --- a/10-regular-expressions-javascript/1-regexp-introduction/article.md +++ /dev/null @@ -1,104 +0,0 @@ -# Паттерны и флаги - -Регулярные выражения –- мощное средство поиска и замены в строке. - -В JavaScript регулярные выражения реализованы отдельным объектом `RegExp` и интегрированы в методы строк. -[cut] - -## Регэкспы - -Регулярное выражение (оно же "регэксп", "регулярка" или просто "рег"), состоит из *паттерна* (он же "шаблон") и необязательных *флагов*. - -Синтаксис создания регулярного выражения: - -```js -var regexp = new RegExp("шаблон", "флаги"); -``` - -Как правило, используют более короткую запись: шаблон внутри слешей `"/"`: - -```js -var regexp = /шаблон/; // без флагов -var regexp = /шаблон/gmi; // с флагами gmi (изучим их дальше) -``` - -Слэши `"/"` говорят JavaScript о том, что это регулярное выражение. Они играют здесь ту же роль, что и кавычки для обозначения строк. - -## Использование - -Основа регулярного выражения -- паттерн. Это строка, которую можно расширить специальными символами, которые делают поиск намного мощнее. - -В простейшем случае, если флагов и специальных символов нет, поиск по паттерну -- то же самое, что и обычный поиск подстроки: - -```js -//+ run -var str = "Я люблю JavaScript!"; // будем искать в этой строке - -var regexp = /лю/; -alert( str.search(regexp) ); // 2 -``` - -Сравните с обычным поиском: - -```js -//+ run -var str = "Я люблю JavaScript!"; - -var substr = "лю"; -alert( str.indexOf(substr) ); // 2 -``` - -Как видим, то же самое, разве что для регэкспа использован метод [search](https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/String/search) -- он как раз работает с регулярными выражениями, а для подстроки -- [indexOf](https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/String/indexOf). - -Но это соответствие лишь кажущееся. Очень скоро мы усложним регулярные выражения, и тогда увидим, что они гораздо мощнее. - -[smart header="Цветовые обозначения"] -Здесь и далее в тексте используется следующая цветовая схема: -
      -
    • регэксп (регулярное выражение) - красный
    • -
    • строка - синий
    • -
    • результат - зеленый
    • -
    -[/smart] - -## Флаги - -Регулярные выражения могут иметь флаги, которые влияют на поиск. - -В JavaScript их всего три: - -
    -
    `i`
    -
    Если этот флаг есть, то регэксп ищет независимо от регистра, то есть не различает между `А` и `а`.
    -
    `g`
    -
    Если этот флаг есть, то регэксп ищет все совпадения, иначе -- только первое.
    -
    `m`
    -
    Многострочный режим.
    -
    - -Самый простой для понимания из этих флагов -- безусловно, `i`. - -Пример его использования: - -```js -//+ run -var str = "Я люблю JavaScript!"; // будем искать в этой строке - -alert( str.search( *!*/ЛЮ/*/!* ) ); // -1 -alert( str.search( *!*/ЛЮ/i*/!* ) ); // 2 -``` - -
      -
    1. С регом /ЛЮ/ вызов вернул `-1`, что означает "не найдено" (как и в `indexOf`),
    2. -
    3. С регом /ЛЮ/i вызов нашёл совпадение на позиции 2, так как стоит флаг `i`, а значит "лю" тоже подходит.
    4. -
    - -Другие флаги мы рассмотрим в последующих главах. - -## Итого - -
      -
    • Регулярное выражение состоит из шаблона и необязательных флагов `g`, `i` и `m`.
    • -
    • Поиск по регулярному выражению без флагов и спец. символов, которые мы изучим далее -- это то же самое, что и обычный поиск подстроки в строке. Но флаги и спец. символы, как мы увидим далее, могут сделать его гораздо мощнее.
    • -
    • Метод строки `str.search(regexp)` возвращает индекс, на котором найдено совпадение.
    • -
    diff --git a/10-regular-expressions-javascript/10-regexp-ahchors/1-start-end/solution.md b/10-regular-expressions-javascript/10-regexp-ahchors/1-start-end/solution.md deleted file mode 100644 index e5118b47..00000000 --- a/10-regular-expressions-javascript/10-regexp-ahchors/1-start-end/solution.md +++ /dev/null @@ -1,6 +0,0 @@ - -Нам нужна строка, которая начинается -- и тут же кончается. То есть, пустая. - -Или, если быть ближе к механике регэкспов, то движок сначала будет искать в тексте начальную позицию ``pattern`^`, а как только найдёт её -- будет ожидать конечной ``pattern`$`. - -Заметим, что и ``pattern`^` и ``pattern`$` не требуют наличия символов. Это -- проверки. В пустой строке движок сначала проверит первую, а потом -- вторую -- и зафиксирует совпадение. \ No newline at end of file diff --git a/10-regular-expressions-javascript/10-regexp-ahchors/1-start-end/task.md b/10-regular-expressions-javascript/10-regexp-ahchors/1-start-end/task.md deleted file mode 100644 index f5df587e..00000000 --- a/10-regular-expressions-javascript/10-regexp-ahchors/1-start-end/task.md +++ /dev/null @@ -1,4 +0,0 @@ -# Регэксп ^$ - -Предложите строку, которая подойдёт под регулярное выражение ``pattern`^$`. - diff --git a/10-regular-expressions-javascript/10-regexp-ahchors/2-test-mac/solution.md b/10-regular-expressions-javascript/10-regexp-ahchors/2-test-mac/solution.md deleted file mode 100644 index 5a91a896..00000000 --- a/10-regular-expressions-javascript/10-regexp-ahchors/2-test-mac/solution.md +++ /dev/null @@ -1,21 +0,0 @@ -Двузначное шестнадцатиричное число -- это ``pattern`[0-9a-f]{2}` (с учётом флага ``pattern`/i`). - -Нам нужно одно такое число, и за ним ещё 5 с двоеточиями перед ними: ``pattern`[0-9a-f]{2}(:[0-9a-f]{2}){5}` - -И, наконец, совпадение должно начинаться в начале строки и заканчиваться -- в конце. То есть, строка целиком должна подходить под шаблон. Для этого обернём шаблон в ``pattern`^...$`. - -Итого, в действии: - - -```js -//+ run -var re = /^[0-9a-fA-F]{2}(:[0-9a-fA-F]{2}){5}$/i; - -alert( re.test('01:32:54:67:89:AB') ); // true - -alert( re.test('0132546789AB') ); // false (нет двоеточий) - -alert( re.test('01:32:54:67:89') ); // false (5 чисел, а не 6) - -alert( re.test('01:32:54:67:89:ZZ') ) // false (ZZ в конце) -``` diff --git a/10-regular-expressions-javascript/10-regexp-ahchors/2-test-mac/task.md b/10-regular-expressions-javascript/10-regexp-ahchors/2-test-mac/task.md deleted file mode 100644 index fecf7dd0..00000000 --- a/10-regular-expressions-javascript/10-regexp-ahchors/2-test-mac/task.md +++ /dev/null @@ -1,20 +0,0 @@ -# Проверьте MAC-адрес - -MAC-адрес сетевого интерфейса состоит из шести двузначиных шестандцатиричных чисел, разделённых двоеточием. - -Например: ``subject`'01:32:54:67:89:AB'`. - -Напишите регулярное выражение, которое по строке проверяет, является ли она корректным MAC-адресом. - -Использование: -```js -var re = ваш регэксп - -alert( re.test('01:32:54:67:89:AB') ); // true - -alert( re.test('0132546789AB') ); // false (нет двоеточий) - -alert( re.test('01:32:54:67:89') ); // false (5 чисел, а не 6) - -alert( re.test('01:32:54:67:89:ZZ') ) // false (ZZ в конце) -``` diff --git a/10-regular-expressions-javascript/10-regexp-ahchors/article.md b/10-regular-expressions-javascript/10-regexp-ahchors/article.md deleted file mode 100644 index 16abf01c..00000000 --- a/10-regular-expressions-javascript/10-regexp-ahchors/article.md +++ /dev/null @@ -1,68 +0,0 @@ -# Начало строки ^ и конец $ - -Знак каретки '^' и доллара '$' имеют в регулярном выражении особый смысл. Их называют "якорями" (anchor - англ.). -[cut] - -Каретка ^ совпадает в начале текста, а доллар $ -- в конце. - -**Якоря являются не символами, а проверками.** - -До этого мы говорили о регулярных выражениях, которые ищут один или несколько символов. Если совпадение есть -- эти символы включаются в результат. - -А якоря -- не такие. Когда поиск ходит до якоря -- он проверяет, есть ли соответствие, если есть -- продолжает идти по шаблону, не прибавляя ничего к результату. - -Каретку ^ обычно используют, чтобы указать, что регулярное выражение необходимо проверить именно с начала текста. - -Например, без каретки найдёт все числа: - -```js -//+ run -var str = '100500 попугаев съели 500100 бананов!'; -alert( str.match(/\d+/ig) ); // 100500, 500100 (нашло все числа) -``` - -А с кареткой -- только первое: - -```js -//+ run -var str = '100500 попугаев съели 500100 бананов!'; -alert( str.match(/^\d+/ig) ); // 100500 (только в начале строки)*!* -``` - -Знак доллара $ используют, чтобы указать, что паттерн должен заканчиваться в конце текста. - -Аналогичный пример с долларом для поиска числа в конце: - -```js -//+ run -var str = '100500 попугаев съели 500100'; -alert( str.match(/\d+$/ig) ); // 500100 -``` - -Оба якоря используют одновременно, если требуется, чтобы шаблон охватывал текст с начала и до конца. Обычно это требуется при валидации. - -Например, мы хотим проверить, что в переменной `num` хранится именно десятичная дробь. - -Ей соответствует регэксп \d+\.\d+. Но простой поиск найдёт дробь в любом тексте: - -```js -//+ run -var num = "ля-ля 12.34"; -alert( num.match(/\d+\.\d+/ig) ); // 12.34 -``` - -Наша же задача -- проверить, что `num` *целиком* соответствует паттерну \d+\.\d+. - -Для этого обернём шаблон в якоря ^...$: - -```js -//+ run -var num = "ля-ля 12.34"; -alert( num.match(/^\d+\.\d+$/ig) ); // null, не дробь - -var num = "12.34"; -alert( num.match(/^\d+\.\d+$/ig) ); // 12.34, дробь! -``` - -Теперь поиск ищет начало текста, за которым идёт число, затем точка, ещё число и конец текста. Это как раз то, что нужно. - diff --git a/10-regular-expressions-javascript/11-regexp-multiline-mode/article.md b/10-regular-expressions-javascript/11-regexp-multiline-mode/article.md deleted file mode 100644 index 918a85eb..00000000 --- a/10-regular-expressions-javascript/11-regexp-multiline-mode/article.md +++ /dev/null @@ -1,89 +0,0 @@ -# Многострочный режим, флаг "m" - -Многострочный режим включается, если у регэкспа есть флаг /m. -[cut] - -В этом случае изменяется поведение ^ и $. - -В многострочном режиме якоря означают не только начало/конец текста, но и начало/конец строки. - -## Начало строки ^ - -В примере ниже текст состоит из нескольких строк. Паттерн /^\d+/gm берёт число с начала каждой строки: - -```js -//+ run -var str = '1е место: Винни\n' + - '2е место: Пятачок\n' + - '33е место: Слонопотам'; - -*!* -alert( str.match(/^\d+/gm) ); // 1, 2, 33 -*/!* -``` - -Обратим внимание -- без флага /m было бы найдено только первое число: - -```js -//+ run -var str = '1е место: Винни\n' + - '2е место: Пятачок\n' + - '33е место: Слонопотам'; - -alert( str.match(/^\d+/g) ); // 1 -``` - -Это потому что в обычном режиме каретка ^ -- это только начало текста, а в многострочном -- начало любой строки. - -Движок регулярных выражений двигается по тексту, и как только видит начало строки, начинает искать там \d+. - -## Конец строки $ - -Символ доллара $ ведёт себя аналогично. - -Регулярное выражение [а-я]+$ в следующем примере находит последнее слово в каждой строке: - -```js -//+ run -var str = '1е место: Винни\n' + - '2е место: Пятачок\n' + - '33е место: Слонопотам'; - -alert( str.match(/[а-я]+$/gim) ); // Винни,Пятачок,Слонопотам -``` - -Без флага m якорь $ обозначал бы конец всего текста, и было бы найдено только последнее слово. - -[smart header="Якорь `$` против `\n`"] -Для того, чтобы найти конец строки, можно использовать не только `$`, но и символ `\n`. - -Но, в отличие от `$`, символ `\n` во-первых берёт символ в результат, а во-вторых -- не совпадает в конце текста (если, конечно, последний символ -- не конец строки). - -Посмотрим, что будет с примером выше, если вместо [а-я]+$ использовать [а-я]+\n: - -```js -//+ run -var str = '1е место: Винни\n' + - '2е место: Пятачок\n' + - '33е место: Слонопотам'; - -alert( str.match(/[а-я]+\n/gim) ); -/* -Винни -,Пятачок -*/ -``` - -Всего два результата: Винни\n (с символом перевода строки) и Пятачок\n. Последнее слово "Слонопотам" здесь не даёт совпадения, так как после него нет перевода строки. -[/smart] - -## Итого - -В мультистрочном режиме: -
      -
    • Символ `^` означает начало строки.
    • -
    • Символ `$` означает конец строки.
    • -
    - -Оба символа являются проверками, они не добавляют ничего к результату. Про них также говорят, что "они имеют нулевую длину". - diff --git a/10-regular-expressions-javascript/12-regexp-lookahead/article.md b/10-regular-expressions-javascript/12-regexp-lookahead/article.md deleted file mode 100644 index 2cd4438c..00000000 --- a/10-regular-expressions-javascript/12-regexp-lookahead/article.md +++ /dev/null @@ -1,4 +0,0 @@ -# Предпросмотр (неготово) - -Требуется добавить главу про предпросмотр lookahead. - diff --git a/10-regular-expressions-javascript/13-regexp-infinite-backtracking-problem/article.md b/10-regular-expressions-javascript/13-regexp-infinite-backtracking-problem/article.md deleted file mode 100644 index 582c1066..00000000 --- a/10-regular-expressions-javascript/13-regexp-infinite-backtracking-problem/article.md +++ /dev/null @@ -1,305 +0,0 @@ -# Чёрная дыра бэктрекинга - -Некоторые регулярные выражения, с виду являясь простыми, могут выполняться оооочень долго, и даже "подвешивать" интерпретатор JavaScript. - -Рано или поздно, с этим сталкивается любой разработчик, потому что нечаянно создать такое регулярное выражение -- легче лёгкого. - -Типична ситуация, когда регулярное выражение до поры до времени работает нормально, и вдруг на каком-то тексте как начнёт "подвешивать" интерпретатор и есть 100% процессора. - -Это может стать уязвимостью. Например, если JavaScript выполняется на сервере, то при разборе данных, присланных посетителем, он может зависнуть, если использует подобный регэксп. На клиенте тоже возможно подобное, при использовании регэкспа для подсветки синтаксиса. - -Такие уязвимости "убивали" почтовые сервера и системы обмена сообщениями и до появления JavaScript, и наверно будут "убивать" и после его исчезновения. Так что мы просто обязаны с ними разобраться. - -[cut] - -## Пример - -План изложения у нас будет таким: - -
      -
    1. Сначала посмотрим на проблему в реальной ситуации.
    2. -
    3. Потом упростим реальную ситуацию до "корней" и увидим, откуда она берётся.
    4. -
    - -Рассмотрим, например, поиск по HTML. - -Мы хотим найти теги с атрибутами, то есть совпадения вида <a href="..." class=doc ...>. - -Самый простой способ это сделать -- <[^>]*>. Но он же и не совсем корректный, так как тег может выглядеть так: <a test="<>" href="#">. То есть, внутри "закавыченного" атрибута может быть символ `>`. Простейший регэксп на нём остановится и найдёт <a test="<>. - -Соответствие: -``` -<[^>]*....> -
    -``` - -А нам нужен весь тег. - -Для того, чтобы правильно обрабатывать такие ситуации, нужно учесть их в регулярном выражении. Оно будет иметь вид <тег (ключ=значение)*>. - -Если перевести на язык регэкспов, то: <\w+(\s*\w+=(\w+|"[^"]*")\s*)*>: -
      -
    1. <\w+ -- начало тега
    2. -
    3. (\s*\w+=(\w+|"[^"]*")\s*)* -- произвольное количество пар вида `слово=значение`, где "значение" может быть также словом \w+, либо строкой в кавычках "[^"]*".
    4. -
    - - -Мы пока не учитываем все детали грамматики HTML, ведь строки возможны и в 'одинарных' кавычках, но на данный момент этого достаточно. Главное, что регулярное выражение получилось в меру простым и понятным. - - -Испытаем полученный регэксп в действии: - -```js -//+ run -var reg = /<\w+(\s*\w+=(\w+|"[^"]*")\s*)*>/g; - -var str='...
    ... ...'; - -alert( str.match(reg) ); // , -``` - -Отлично, всё работает! Нашло как длинный тег <a test="<>" href="#">, так и одинокий <b>. - -А теперь -- демонстрация проблемы. - -Если запустить пример ниже, то он может подвесить браузер: - -```js -//+ run -var reg = /<\w+(\s*\w+=(\w+|"[^"]*")\s*)*>/g; - -var str = "/g; - -var str = "(\d+)*$. - -В большинстве движков регэкспов, например в Chrome или IE, этот поиск выполняется очень долго (осторожно, может "подвесить" браузер): - -```js -//+ run -alert( '12345678901234567890123456789123456789z'.match(/(\d+)*$/) ); -``` - -В чём же дело, что не так с регэкспом? - -Внимательный читатель, посмотрев на него, наверняка удивится, ведь он "какой-то странный". Квантификатор * здесь выглядит лишним. - -Если хочется найти число, то с тем же успехом можно искать \d+$. - -Да, этот регэксп носит искусственный характер, но, разобравшись с ним, мы поймём и практический пример, данный выше. Причина их медленной работы одинакова. - -В целом, с регэкспом "всё так", синтаксис вполне допустимый. Проблема в том, как выполняется поиск по нему. - -Посмотрим, что происходит при поиске в строке 123456789z: - -
      -
    1. Первым делом, движок регэкспов пытается найти \d+. Плюс + является жадным по умолчанию, так что он хватает все цифры, какие может: - -``` -\d+....... -(123456789)z -``` -
    2. -
    3. Затем движок пытается применить звёздочку вокруг скобок (\d+)*, но больше цифр нет, так что звёздочка не даёт повторений. - -Затем в шаблоне идёт символ конца строки $, а в тексте -- символ z. - -``` - X -\d+........$ -(123456789)z -``` -Соответствия нет. -
    4. -
    5. Так как соответствие не найдено, то "жадный" плюс + отступает на один символ (бэктрекинг). - -Теперь `\d+` -- это все цифры, за исключением последней: -``` -\d+....... -(12345678)9z -``` -
    6. -
    7. После бэктрекинга, \d+ содержит всё число, кроме последней цифры. Движок снова пытается найти совпадение, уже с новой позиции (`9`). - -Звёздочка (\d+)* теперь может быть применена -- она даёт число 9: - -``` - -\d+.......\d+ -(12345678)(9)z -``` -Движок пытается найти `$`, но это ему не удаётся -- на его пути опять `z`: - -``` - X -\d+.......\d+ -(12345678)(9)z -``` - -Так как совпадения нет, то поисковой движок отступает назад ещё раз. -
    8. -
    9. Теперь первое число \d+ будет содержать 7 цифр, а остаток строки 89 становится вторым \d+: - - -``` - X -\d+......\d+ -(1234567)(89)z -``` - -Увы, всё ещё нет соответствия для $. - -Поисковой движок снова должен отступить назад. При этом последний жадный квантификатор отпускает символ. В данном случае это означает, что укорачивается второй \d+, до одного символа 8, и звёздочка забирает следующий 9. - - -``` - X -\d+......\d+\d+ -(1234567)(8)(9)z -``` -
    10. -
    11. ...И снова неудача. Второе и третье \d+ отступили по-максимуму, так что сокращается снова первое число, до 123456, а звёздочка берёт оставшееся: - -``` - X -\d+.......\d+ -(123456)(789)z -``` - -Снова нет совпадения. Процесс повторяется, последний жадный квантификатор + отпускает один символ (`9`): - -``` - X -\d+.....\d+ \d+ -(123456)(78)(9)z -``` -
    12. -
    13. -...И так далее. -
    14. -
    - -Получается, что движок регулярных выражений перебирает все комбинации из `123456789` и их подпоследовательности. А таких комбинаций очень много. - -На этом месте умный читатель может воскликнуть: "Во всём виноват бэктрекинг? Давайте включим ленивый режим -- и не будет никакого бэктрекинга!" - -Что ж, заменим \d+ на \d+? и посмотрим (аккуратно, может подвесить браузер): - -```js -//+ run -alert( '12345678901234567890123456789123456789z'.match(/(\d+?)*$/) ); -``` - -Не помогло! - -**Ленивые регулярные выражения делают то же самое, но в обратном порядке.** - -Просто подумайте о том, как будет в этом случае работать поисковой движок. - -Некоторые движки регулярных выражений содержат хитрые проверки и конечные автоматы, которые позволяют избежать бесконечного перебора или кардинально ускорить его, но все движки и не всегда. - -Возвращаясь к примеру выше -- при поиске <(\s*\w+=\w+\s*)*> в строке <a=b a=b a=b a=b происходит то же самое. - -Поиск успешно начинается, выбирается некая комбинация из \s*\w+=\w+\s*, которая, так как в конце нет `>`, оказывается не подходящей. Движок честно отступает, пробует другую комбинацию -- и так далее. - -## Что делать? - -Проблема -- в сверхмноговариантном переборе. - -Движок регулярных выражений перебирает кучу возможных вариантов скобок там, где это не нужно. - -Например, в регэкспе (\d+)*$ нам (людям) очевидно, что в (\d+) откатываться не нужно. От того, что вместо одного \d+ у нас два независимых \d+\d+, ничего не изменится. - -Без разницы: - -``` -\d+........ -(123456789)z - -\d+...\d+.... -(1234)(56789)z -``` - -Если вернуться к более реальному примеру <(\s*\w+=\w+\s*)*> то -cам алгоритм поиска, который у нас в голове, предусматривает, что мы "просто" ищем тег, а потом пары `атрибут=значение` (сколько получится). - -Никакого "отката" здесь не нужно. - -В современных регулярных выражениях для решения этой проблемы придумали "possessive" (сверхжадные? неоткатные? точный перевод пока не устоялся) квантификаторы, которые вообще не используют бэктрегинг. - -То есть, они даже проще, чем "жадные" -- берут максимальное количество символов и всё. Поиск продолжается дальше. При несовпадении никакого возврата не происходит. - -Это, c стороны уменьшает количество возможных результатов, но с другой стороны -- в ряде случаев очевидно, что возврат (уменьшение количество повторений квантификатора) результата не даст. А только потратит время, что как раз и доставляет проблемы. Как раз такие ситуации и описаны выше. - -Есть и другое средство -- "атомарные скобочные группы", которые запрещают перебор внутри скобок, по сути позволяя добиваться того же, что и сверхжадные квантификаторы, - -К сожалению, в JavaScript они не поддерживаются. - -Однако, можно получить подобный эффект при помощи предпросмотра. Подробное описание соответствия с учётом синтаксиса сверхжадных квантификаторов и атомарных групп есть в статьях [Regex: Emulate Atomic Grouping (and Possessive Quantifiers) with LookAhead](http://instanceof.me/post/52245507631/regex-emulate-atomic-grouping-with-lookahead) и [Mimicking Atomic Groups](http://blog.stevenlevithan.com/archives/mimic-atomic-groups), здесь же мы останемся в рамках синтаксиса JavaScript. - -Взятие максимального количества повторений `a+` без отката выглядит так: (?=(a+))\1. - -То есть, иными словами, предпросмотр ?= ищет максимальное количество повторений a+, доступных с текущей позиции. А затем они "берутся в результат" обратной ссылкой \1. Дальнейший поиск -- после найденных повторений. - -Откат в этой логике принципе не предусмотрен, поскольку предпросмотр "откатываться" не умеет. То есть, если предпросмотр нашёл 5 штук a+, и в результате поиск не удался, то он не будет откатываться на 4 повторения. Эта возможность в предпросмотре отсутствует, а в данном случае она как раз и не нужна. - -Исправим регэксп для поиска тега с атрибутами <\w+(\s*\w+=(\w+|"[^"]*")\s*)*>, описанный в начале главы. Используем предпросмотр, чтобы запретить откат на меньшее количество пар `атрибут=значение`: - -```js -//+ run -// регэксп для пары атрибут=значение -var attr = /(\s*\w+=(\w+|"[^"]*")\s*)/ - -// используем его внутри регэкспа для тега -var reg = new RegExp('<\\w+(?=(' + attr.source + '*))\\1>', 'g'); - -var good = '...
    ... ...'; - -var bad = ", -alert( bad.match(reg) ); // null (нет результатов, быстро) -``` - -Отлично, всё работает! Нашло как длинный тег <a test="<>" href="#">, так и одинокий <b>. - - - - - - - diff --git a/10-regular-expressions-javascript/13-regexp-infinite-backtracking-problem/bad_backtrack_greedy1.png b/10-regular-expressions-javascript/13-regexp-infinite-backtracking-problem/bad_backtrack_greedy1.png deleted file mode 100644 index 8f207c4d06a706af96c42287d48882cf83a5645e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2357 zcmV-53Ci|~P)P(WY+-|yez;^O}$B{-Zo_xty-n>_vMEvuVs#k-@CensWb zF{qeir_-mhq4Lg-NNBKHkJBzO$Igz@y;X)X=>- z>)AA|pMLq`A-S-a(8;-2tXQm|fvAuaChY`Q|3m&B4~u#H5o|(7iC~=i-8L7~|Xpk!JDl>zs^SyQw0CcIaB$dQU>g7czrVjQFfiZW-zNY79==-o000I2Nkl;HY=sD!rHF5t_&-!EAyD4V`gS%W@ct)W@d(eCi!ejvVE7ly|gdd z+wZ;0MLNOnqu=lMl>lfT8v_1QRvH(Yo5w5V=1B%{l9Gp~RBV@Uf8`I4^f+-ZJn>{n za;Wq;UU+&?5hyK@9%pEcBLY3#5P>1_czkE_iOY#o?t~(q@@l6%l}aVaCnafkdejIw zk|$d}Jg#8ZB&EjzCFN8Rws3S|W8pmZ><2$CUHbf8mmbpYOV>~tNF_^Cr6rZgIK?X6 z&@@jyJ@4CPi@tj2nR(}LwPC^oD&v*qU;`^aCja&13k!bu{+sTft$2UYBNw+jPt8Vp zc$W3<+qV^n0KE8|u5y@41{rhvE!)`E5yWxM7*95de(dy=!B`=@SRG zTrqKd*T%*HufHPiot?{oJ@)QgSJ!!)&d#T3}p`gJ3AbGLru zj=S-3Dg}c($zX#SO>GtZ+f)Ub_Bv>6|Ngg5oi=Ui!mIm_J^Xsw-${yy_+I`7YWrsT z)DEkv1=}7t;hG!nxO3)=88dIY?%Hz>JK`q!a4JZ$mG$XMuO2XR{DjLUJv@E(?CJMU zI^*O~K)UGsy0W5a6??OdJodD!Cf_@2)^dMvB9@>h%we# zJFSp5hS|Wh1ca8~uwdR4euQSlxE=+<&>)j;1xL^{cwUV7o)~tGEv?Y4AiuJ+IY!*6B=SA5O)zP)SPb(x8m4Qh z7_l?cobyLm<7ZO8c%0DrDF~Wc#FmObRLw7$MVS4jSfw?hcxl~?{ZMYV-x)E~J+X@!LQOVE6aUj+r zadehRx_e~U8)|r)GGzBZ10&VXN7sx(5sJhKL`N0)AhwI+*oCqkGfXXCBrFja4zh(F z6SG3KbZQDJa9q(iT>3ikC5mGJ(R&ex6s%(Lxu#Irf_mZLI9|d8WCy2ttiDH<^COiE zB#363ukF@x#9X8C#hkA;h9H3BNEX5-#}_F{SU6OYL%fEPN`WM&)R>=1^xO=HpdCp5 z09`9MCc-w?B=IGx3pKWw8oP}X=W?gn6f2aYUKk7kM--U+EfY}(Oh*jlCWV45F4ujTYXeSXYy=$lcBhwqFoKDI z5Q;dWAJA=u!p!;3#DUMqqHi7%rvOb@y2Gn#oV%_cLa_vv@D>Oz#MenIKi}fI!Z$oO zl^8||UANdbWJYb@zK)A{Em8DN0IIM5j*JbYb|$`*;Q;tb)&IGbZ74TQUiE@KL} zhTw59I*xhKQT-n8JXHF$*TcnUaebB|-lC2p3XECeUcm!Zbu!K5+qxAzHI0nXHR09} bJ!bX~{I$l4p1@;800000NkvXXu0mjf5J=fH diff --git a/10-regular-expressions-javascript/13-regexp-infinite-backtracking-problem/bad_backtrack_greedy11.png b/10-regular-expressions-javascript/13-regexp-infinite-backtracking-problem/bad_backtrack_greedy11.png deleted file mode 100644 index 713532aeabedbb9f44be5db8f094efbd2e1c32a0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1119 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 diff --git a/10-regular-expressions-javascript/13-regexp-infinite-backtracking-problem/bad_backtrack_greedy3.png b/10-regular-expressions-javascript/13-regexp-infinite-backtracking-problem/bad_backtrack_greedy3.png deleted file mode 100644 index 8d0cd5221fb120c82386dbd4f79c771dc6a23875..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2505 zcmV;)2{!hLP)nAQBhI<%*_8hJpYA-{{R60{{R3bCIA10h5yXV+1dZUzyIdu|D&V-l$8H;bpQW6 zJpbnA^Yi}zfB^r$zyD)n|8#W!l$5ct|No<-|0N~=@hg0Me50eI&(F{M=_>!(*}wn* z&*#to?JV=p&unaLy1KfquCC(Z;_vtGK%hYX_$~i1F#q%O{~#dQ+1dH!C;8+i&_F=@ z@9&Fr5Q>V5?Ck9Q>?_d8yZ-Ge|L!a9?C4QJ5wV{i-OMNd^DY1BB7|}k|FNMn4& zaHyGG_xJb3y`}NpGV|Oa@$c;a@G1T6EAQ{`$iTDq-XNlq9Y8=p+;DKT0095>EnZF& z{O2e3+8h7!DgXW}?b|5#{2|Nk$SgBGu!9{=hhy`eAa z#|!h&5sGpUP^eIrmX<(Z0K~+^v!irdTU)4@UDC_C+Qu>Z`S-7(Z>5ns*wMk!%Dvpl zHk*b;`QaeYw=$TBWBTSM+0)7F)FPOKOZVU)-|ye>-!aR;oUNQ&{OKn!m@u4*M)u() zrISN#F>Obp^Z^!XlReekG-{?5Qq@LxT5#__gJi0zu&*A zo_p=<b{Vwj@DB|AI*~d4ejXm_; zA@bH5z_+NKh)DPL^qPY^!2|?YSXkM~Cvb3ZX=!Pvr>DlLBkAVhshDEOsyFi17|pmo z)V(RRp-tw}E%Wj2+sIYFx1_F^Pp6MPtD7C1iyF|pJ?qL7|K}q0^YPZXA*qZD#jR1t zrx_an0Jx@P=HuSMq#MYqEif=J{qQWmzrXb2C$Xg<=+-bN007_L-`U6~zO|p<&L_B~ zQoOO8>fS2OyG-)oD58oI+_?_>=qSjxX5-H-*TpWWm>c}+E2x_v|LZJKKoO069_r5; z!l_8&!xPD>7Os&B;k^y{)DZR25BAa#hjbNyZWZjv3Y2{kfa5iN000JrNklqKBaGNb%DQi=vb;Xs}b;Xro%-k_EGcz+YGcz+Y^LEl%(%o6M z>n{%IeP870{O-N`AN=^8m4~qme){j0P)Mqm`Y9hjk4~ zB1N$p@Oq6_bOs<#*THsHNFwfGv?SOWcwE;}v(AfyCu&D2ng|5SIu(!Ox-<|hjl_$C z$Bt4-0DqPRBAti_Bx(tqGK(H6i-RYcAZ%kXcUh&$aU~U{__1+^9e|^WJ>o!TWAFzWsPAf<@

    gs__Jps7tfww>XZo!Ig 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. При этом часть строки, соответствующая SCRIPT, выделена в отдельный элемент массива. - -Позже мы ещё вернёмся к скобочным выражениям, они особенно удобны для поиска с заменой. - -## str.match(reg) с флагом g - -При наличии флага `g`, вызов `match` возвращает обычный массив из всех совпадений. - -Никаких дополнительных свойств у массива в этом случае нет, скобки дополнительных элементов не порождают. - -Например: - -```js -//+ run -var str = "ОЙ-Ой-ой"; - -var result = str.match( *!*/ой/ig*/!* ); - -alert( result ); // ОЙ, Ой, ой -``` - -Пример со скобками: - -```js -//+ run -var str = "javascript - это такой язык"; - -var result = str.match( *!*/JAVA(SCRIPT)/gi*/!* ); - -alert( result[0] ); // javascript -alert( result.length ); // 1 -alert( result.index ); // undefined -``` - -Из последнего примера видно, что элемент в массиве ровно один, и свойства `index` также нет. Такова особенность глобального поиска при помощи `match` -- он просто возвращает все совпадения. - -Для расширенного глобального поиска, который позволит получить все позиции и, при желании, скобки, нужно использовать метод [RegExp#exec](https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/RegExp/exec), которые будет рассмотрен далее. - -[warn header="В случае, если совпадений не было, `match` возвращает `null`"] -Обратите внимание, это важно -- если `match` не нашёл совпадений, он возвращает не пустой массив, а именно `null`. - -Это важно иметь в виду, чтобы не попасть в такую ловушку: - -```js -//+ run -var str = "Ой-йой-йой"; - -// результат match не всегда массив! -alert(str.match(/лю/gi).length) // ошибка! нет свойства length у null -``` -[/warn] - -## str.split(reg|substr, limit) - -Разбивает строку в массив по разделителю -- регулярному выражению `regexp` или подстроке `substr`. - -Обычно мы используем метод `split` со строками, вот так: - -```js -//+ run -alert('12-34-56'.split('-')) // [12, 34, 56] -``` - -Можно передать в него и регулярное выражение, тогда он разобьёт строку по всем совпадениям. - -Тот же пример с регэкспом: - -```js -//+ run -alert('12-34-56'.split(/-/)) // [12, 34, 56] -``` - -## str.replace(reg, str|func) - -Швейцарский нож для работы со строками, поиска и замены любого уровня сложности. - -Его простейшее применение -- поиск и замена подстроки в строке, вот так: - -```js -//+ run -// заменить дефис на двоеточие -alert('12-34-56'.replace("-", ":")) // 12:34-56 -``` - -**При вызове со строкой замены `replace` всегда заменяет только первое совпадение.** - -Чтобы заменить *все* совпадения, нужно использовать для поиска не строку `"-"`, а регулярное выражение /-/g, причём обязательно с флагом `g`: - -```js -//+ run -// заменить дефис на двоеточие -alert( '12-34-56'.replace( *!*/-/g*/!*, ":" ) ) // 12:34:56 -``` - - -В строке для замены можно использовать специальные символы: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    СпецсимволыДействие в строке замены
    `$$`Вставляет `"$"`.
    `$&`Вставляет всё найденное совпадение.
    $`Вставляет часть строки до совпадения.
    - $' - Вставляет часть строки после совпадения.
    - $*n* - где `n` -- цифра или двузначное число, обозначает `n-ю` по счёту скобку, если считать слева-направо.
    - -Пример использования скобок и `$1`, `$2`: - -```js -//+ run -var str = "Василий Пупкин"; - -alert(str.replace(/(Василий) (Пупкин)/, '$2, $1')) // Пупкин, Василий -``` - -Ещё пример, с использованием `$&`: - -```js -//+ run -var str = "Василий Пупкин"; - -alert(str.replace(/Василий Пупкин/, 'Великий $&!')) // Великий Василий Пупкин! -``` - -**Для ситуаций, который требуют максимально "умной" замены, в качестве второго аргумента предусмотрена функция.** - -Она будет вызвана для каждого совпадения, и её результат будет вставлен как замена. - -Например: - -```js -//+ run -var i = 0; - -// заменить каждое вхождение "ой" на результат вызова функции -alert("ОЙ-Ой-ой".replace(/ой/gi, function() { - return ++i; -})); // 1-2-3 -``` - -В примере выше функция просто возвращала числа по очереди, но обычно она основывается на поисковых данных. - -Эта функция получает следующие аргументы: - -

      -
    1. `str` -- найденное совпадение,
    2. -
    3. `p1, p2, ..., pn` -- содержимое скобок (если есть),
    4. -
    5. `offset` -- позиция, на которой найдено совпадение,
    6. -
    7. `s` -- исходная строка.
    8. -
    - -Если скобок в регулярном выражении нет, то у функции всегда будет ровно 3 аргумента: `replacer(str, offset, s)`. - -Используем это, чтобы вывести полную информацию о совпадениях: - -```js -//+ run -// вывести и заменить все совпадения -function replacer(str, offset, s) { - alert( "Найдено: " + str + " на позиции: " + offset + " в строке: " + s ); - return str.toLowerCase(); -} - -var result = "ОЙ-Ой-ой".replace(/ой/gi, replacer); -alert( 'Результат: ' + result ); // Результат: ой-ой-ой -``` - -С двумя скобочными выражениями -- аргументов уже 5: - -```js -//+ run -function replacer(str, name, surname, offset, s) { - return surname + ", " + name; -} - -alert(str.replace(/(Василий) (Пупкин)/, replacer)) // Пупкин, Василий -``` - -Функция -- это самый мощный инструмент для замены, какой только может быть. Она владеет всей информацией о совпадении и имеет доступ к замыканию, поэтому может всё. - -## regexp.test(str) - -Теперь переходим к методам класса `RegExp`. - -Метод `test` проверяет, есть ли хоть одно совпадение в строке `str`. Возвращает `true/false`. - -Работает, по сути, так же, как и проверка `str.search(reg) != -1`, например: - -```js -//+ run -var str = "Люблю регэкспы я, но странною любовью"; - -// эти две проверки идентичны -alert( *!*/лю/i*/!*.test(str) ) // true -alert( str.search(*!*/лю/i*/!*) != -1 ) // true -``` - -Пример с отрицательным результатом: - -```js -//+ run -var str = "Ой, цветёт калина..."; - -alert( *!*/javascript/i*/!*.test(str) ) // false -alert( str.search(*!*/javascript/i*/!*) != -1 ) // false -``` - -## regexp.exec(str) - -Для поиска мы уже видели методы: -
      -
    • `search` -- ищет индекс
    • -
    • `match` -- если регэксп без флага `g` -- ищет совпадение с подрезультатами в скобках
    • -
    • `match` -- если регэксп с флагом `g` -- ищет все совпадения, но без скобочных групп.
    • -
    - -Метод `regexp.exec` дополняет их. Он позволяет искать и все совпадения и скобочные группы в них. - -Он ведёт себя по-разному, в зависимости от того, есть ли у регэкспа флаг `g`. - -
      -
    • Если флага `g` нет, то `regexp.exec(str)` ищет и возвращает первое совпадение, является полным аналогом вызова `str.match(reg)`.
    • -
    • Если флаг `g` есть, то вызов `regexp.exec` возвращает первое совпадение и *запоминает* его позицию в свойстве `regexp.lastIndex`. Последующий поиск он начнёт уже с этой позиции. Если совпадений не найдено, то сбрасывает `regexp.lastIndex` в ноль.
    • -
    - -Это используют для поиска всех совпадений в цикле: - -```js -//+ run -var str = 'Многое по JavaScript можно найти на сайте http://javascript.ru'; - -var regexp = /javascript/ig; - -alert( "Начальное значение lastIndex: " + regexp.lastIndex ); - -while (result = regexp.exec(str)) { - alert( 'Найдено: ' + result[0] + ' на позиции:' + result.index ); - alert( 'Свойство lastIndex: ' + regexp.lastIndex ); -} - -alert( 'Конечное значение lastIndex: ' + regexp.lastIndex ); -``` - -Здесь цикл продолжается до тех пор, пока `regexp.exec` не вернёт `null`, что означает "совпадений больше нет". - -Найденные результаты последовательно помещаются в `result`, причём находятся там в том же формате, что и `match` -- с учётом скобок, со свойствами `result.index` и `result.input`. - -[smart header="Поиск с нужной позиции"] -Можно заставить `regexp.exec` искать сразу с нужной позиции, если поставить `lastIndex` вручную: - -```js -//+ run -var str = 'Многое по JavaScript можно найти на сайте http://javascript.ru'; - -var regexp = /javascript/ig; -regexp.lastIndex = 40; - -alert( regexp.exec(str).index ); // 49, поиск начат с 40й позиции -``` -[/smart] - -## Итого, рецепты - -Методы становятся гораздо понятнее, если разбить их использование по задачам, которые нужны в реальной жизни. - -
    -
    Для поиска только одного совпадения:
    -
    -
      -
    • Найти позицию первого совпадения -- `str.search(reg)`.
    • -
    • Найти само совпадение -- `str.match(reg)`.
    • -
    • Проверить, есть ли хоть одно совпадение -- `regexp.test(str)` или `str.search(reg) != -1`.
    • -
    • Найти совпадение с нужной позиции -- `regexp.exec(str)`, начальную позицию поиска задать в `regexp.lastIndex`.
    • -
    -
    -
    Для поиска всех совпадений:
    -
    -
      -
    • Найти массив совпадений -- `str.match(reg)`, с флагом `g`.
    • -
    • Получить все совпадения, с подробной информацией о каждом -- `regexp.exec(str)` с флагом `g`, в цикле.
    • -
    -
    - -
    Для поиска-и-замены:
    -
    -
      -
    • Замена на другую строку или функцией -- `str.replace(reg, str|func)`
    • -
    -
    -
    Для разбивки строки на части:
    -
    -
      -
    • `str.split(str|reg)`
    • -
    -
    -
    - -Зная эти методы, мы уже можем использовать регулярные выражения. - -Конечно, для этого желательно хорошо понимать их синтаксис и возможности, так что переходим к ним дальше. diff --git a/10-regular-expressions-javascript/3-regexp-character-classes/1-find-time-hh-mm/solution.md b/10-regular-expressions-javascript/3-regexp-character-classes/1-find-time-hh-mm/solution.md deleted file mode 100644 index 1fd6b26a..00000000 --- a/10-regular-expressions-javascript/3-regexp-character-classes/1-find-time-hh-mm/solution.md +++ /dev/null @@ -1,8 +0,0 @@ - -Ответ: \d\d:\d\d. - -```js -//+ run -alert( "Завтрак в 09:00.".match( /\d\d:\d\d/ ) ); // 09:00 -``` - diff --git a/10-regular-expressions-javascript/3-regexp-character-classes/1-find-time-hh-mm/task.md b/10-regular-expressions-javascript/3-regexp-character-classes/1-find-time-hh-mm/task.md deleted file mode 100644 index f92b52a5..00000000 --- a/10-regular-expressions-javascript/3-regexp-character-classes/1-find-time-hh-mm/task.md +++ /dev/null @@ -1,8 +0,0 @@ -# Найдите время - -Время имеет формат `часы:минуты`. И часы и минуты состоят из двух цифр, например: `09:00`. - -Напишите регулярное выражение для поиска времени в строке: Завтрак в 09:00. - -P.S. В этой задаче выражению позволительно найти и некорректное время, например `25:99`. - diff --git a/10-regular-expressions-javascript/3-regexp-character-classes/article.md b/10-regular-expressions-javascript/3-regexp-character-classes/article.md deleted file mode 100644 index 26fd9277..00000000 --- a/10-regular-expressions-javascript/3-regexp-character-classes/article.md +++ /dev/null @@ -1,271 +0,0 @@ -# Классы и спецсимволы - -Рассмотрим практическую задачу -- есть телефонный номер `"+7(903)-123-45-67"`, и нам нужно найти в этой строке цифры. А остальные символы нас не интересуют. - -Для поиска символов определённого вида в регулярных выражениях предусмотрены "классы символов". - -[cut] - -Класс символов -- это специальное обозначение, под которое подходит любой символ из определённого набора. - -Например, есть класс "любая цифра". Он обозначается `\d`. Это обозначение вставляется в шаблон, и при поиске под него подходит любая цифра. - -То есть, регулярное выражение /\d/ ищет ровно одну цифру: - -```js -//+ run -var str = "+7(903)-123-45-67"; - -var reg = /\d/; - -// не глобальный регэксп, поэтому ищет только первую цифру -alert( str.match(reg) ); // 7 -``` - -...Ну а для поиска всех цифр достаточно добавить к регэкспу флаг `g`: - -```js -//+ run -var str = "+7(903)-123-45-67"; - -var reg = /\d/g; - -alert( str.match(reg) ); // массив всех совпадений: 7,9,0,3,1,2,3,4,5,6,7 -``` - -## Важнейшие классы: \d \s \w - -Это был класс для цифр. - -Конечно же, есть и другие. - -Наиболее часто используются: -
    -
    `\d` (от английского "digit" -- "цифра")
    -
    Цифра, символ от `0` до `9`.
    -
    `\s` (от английского "space" -- "пробел")
    -
    Пробельный символ, включая табы, переводы строки и т.п.
    -
    `\w` (от английского "word" -- "слово")
    -
    Символ "слова", а точнее -- буква латинского алфавита или цифра или подчёркивание `'_'`. Не-английские буквы не являются `\w`, то есть русская буква не подходит.
    -
    - -Например, \d\s\w обозначает цифру, за которой идёт пробельный символ, а затем символ слова. - -Регулярное выражение может содержать одновременно и обычные символы и классы. - -Например, CSS\d найдёт строку CSS, с любой цифрой после неё: - -```js -//+ run -var str = "Стандарт CSS4 - это здорово"; -var reg = /CSS\d/ - -alert( str.match(reg) ); // CSS4 -``` - -И много классов подряд: - -```js -//+ run -alert( "Я люблю HTML5!".match(/\s\w\w\w\w\d/) ); // 'HTML5' -``` - -Совпадение (каждому классу в регэкспе соответствует один символ результата): - - - -## Граница слова \b - -Граница слова \b -- это особый класс. - -Он интересен тем, что обозначает не символ, а границу между символами. - -Например, \bJava\b найдёт слово Java в строке Hello, Java!, но не в строке Hello, Javascript!. - - -```js -//+ run - -alert( "Hello, Java!".match(/\bJava\b/) ); // Java -alert( "Hello, Javascript!".match(/\bJava\b/) ); // null -``` - -Граница имеет "нулевую ширину" в том смысле, что обычно символам регулярного выражения соответствуют символы строки, но не в этом случае. - -Граница -- это проверка. - -При поиске движок регулярных выражений идёт по шаблону и одновременно по строке, пытаясь построить соответствие. Когда он видит \b, то проверяет, что текущая позиция в строке подходит под одно из условий: -
      -
    • Начало текста, если первый символ `\w`.
    • -
    • Конец текста, если последний символ `\w`.
    • -
    • Внутри текста, если с одной стороны `\w`, а с другой -- не `\w`.
    • -
    - -Например, в строке Hello, Java! под `\b` подходят следующие позиции: - - - -Как правило, `\b` используется, чтобы искать отдельно стоящее слово. Не на русском конечно, хотя подобную проверку, как мы увидим далее, можно легко сделать для любого языка. А вот на английском, как в примере выше или для чисел, которые являются частным случаем `\w` -- легко. - -Например, регэксп \b\d\d\b ищет отдельно двузначные числа. Иными словами, он требует, чтобы до и после \d\d был символ, отличный от `\w` (или начало/конец текста). - - -## Обратные классы - -Для каждого класса существует "обратный ему", представленный такой же, но заглавной буквой. - -"Обратный" -- означает, что ему соответствуют все остальные символы, например: - -
    -
    `\D`
    -
    Не-цифра, то есть любой символ кроме `\d`, например буква.
    -
    `\S`
    -
    Не-пробел, то есть любой символ кроме `\s`, например буква.
    -
    `\W`
    -
    Любой символ, кроме `\w`, то есть не латинница, не подчёркивание, не цифра. В частности, русские буквы принадлежат этому классу.
    -
    `\B`
    -
    Проверка, обратная `\b`.
    -
    - -В начале этой главы мы видели, как получить из телефона +7(903)-123-45-67 все цифры. - -Первый способ -- найти все цифры через `match(/\d/g)`. - -Обратные классы помогут реализовать альтернативный -- найти все НЕцифры и удалить их из строки: - -```js -//+ run -var str = "+7(903)-123-45-67"; - -alert( str.replace(/\D/g, "") ); // 79031234567 -``` - -## Пробелы -- обычные символы - -Заметим, что в регулярных выражениях пробел -- такой же символ, как и другие. - -Обычно мы не обращаем внимание на пробелы. Для нашего взгляда строки 1-5 и 1 - 5 почти идентичны. - -Однако, если регэксп не учитывает пробелов, то он не сработает. - -Попытаемся найти цифры, разделённые дефисом: - -```js -//+ run -alert( "1 - 5".match(/\d-\d/) ); // null, нет совпадений! -``` - -Поправим это, добавив в регэксп пробелы: - -```js -//+ run -alert( "1 - 5".match(/\d - \d/) ); // работает, пробелы вокруг дефиса -``` - -Конечно же, пробелы в регэкспе нужны лишь тогда, когда мы их ищем. Лишние пробелы (как и любые лишние символы) могут навредить: - -```js -//+ run -alert( "1-5".match(/\d - \d/) ); // null, так как в строке 1-5 нет пробелов -``` - -Короче говоря, в регулярном выражении все символы имеют значение. Даже (и тем более) -- пробелы. - -## Точка -- любой символ - -Особым классом символов является точка `"."`. - -В регулярном выражении, точка "." обозначает *любой символ*, кроме перевода строки: - -```js -//+ run -alert( "Z".match(/./) ); // найдено Z -``` - -Посередине регулярного выражения: - -```js -//+ run -var re = /CS.4/; - -alert( "CSS4".match(re) ); // найдено "CSS4" -alert( "CS-4".match(re) ); // найдено "CS-4" -alert( "CS 4".match(re) ); // найдено "CS 4" (пробел тоже символ) -``` - -Обратим внимание -- точка означает именно "произвольный символ". - -То есть какой-то символ на этом месте в строке должен быть: - -```js -//+ run -alert( "CS4".match(/CS.4/) ); // нет совпадений, так как для точки нет символа -``` - -## Экранирование специальных символов - -В регулярных выражениях есть и другие символы, имеющие особый смысл. - -Они используются, чтобы расширить возможности поиска. - -Вот их полный список: [ \ ^ $ . | ? * + ( ). - -Не пытайтесь запомнить его -- когда мы разберёмся с каждым из них по отдельности, он запомнится сам собой. - -**Чтобы использовать специальный символ в качестве обычного, он должен быть *экранирован*.** - -Или, другими словами, перед символом должен быть обратный слэш `'\'`. - -Например, нам нужно найти точку '.'. В регулярном выражении она означает "любой символ, кроме новой строки", поэтому чтобы найти именно сам символ "точка" -- её нужно экранировать: \.. - -```js -//+ run -alert( "Глава 5.1".match(/\d\.\d/) ); // 5.1 -``` - -Круглые скобки также являются специальными символами, так что для поиска именно скобки нужно использовать `\(`. Пример ниже ищет строку `"g()"`: - -```js -//+ run -alert( "function g()".match(/g\(\)/) ); // "g()" -``` - -Сам символ слэш `'/'`, хотя и не является специальными символом в регулярных выражениях, но открывает-закрывает регэксп в синтаксисе /...pattern.../, поэтому его тоже нужно экранировать. - -Так выглядит поиск слэша `'/'`: - -```js -//+ run -alert( "/".match(/\//) ); // '/' -``` - -Ну и, наконец, если нам нужно найти сам обратный слэш `\`, то его нужно просто задублировать. - -Так выглядит поиск обратного слэша `"\"`: - -```js -//+ run -alert( "1\2".match(/\\/) ); // '\' -``` - - -## Итого - -Мы рассмотрели классы для поиска типов символов: - -
      -
    • `\d` -- цифры.
    • -
    • `\D` -- не-цифры.
    • -
    • `\s` -- пробельные символы, переводы строки.
    • -
    • `\S` -- всё, кроме `\s`.
    • -
    • `\w` -- латинница, цифры, подчёркивание `'_'`.
    • -
    • `'.'` -- точка обозначает любой символ, кроме перевода строки.
    • -
    - -Если хочется поискать именно сочетание `"\d"` или символ "точка", то его экранируют обратным слэшем, вот так: \. - -Заметим, что регулярное выражение может также содержать перевод строки `\n`, табуляцию `\t` и прочие спецсимволы для строк. Конфликта с классами не происходит, так как для них зарезервированы другие буквы. - - - - diff --git a/10-regular-expressions-javascript/3-regexp-character-classes/hello-java-boundaries.png b/10-regular-expressions-javascript/3-regexp-character-classes/hello-java-boundaries.png deleted file mode 100644 index 3a47f13c14fa887e3e221e7da36a4d57720a42b8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3614 zcmV+(4&m{MP)Px?*hxe|RCodH91T=dRrJ#BHK1(qUZ^icpl$4*1~fPmMW;Ra{v1x^33ooTglqD8m-qocuaDz;vTae3VZ3(Z(UENuWLlB2fE&Ex3n zelRiN)m;Hix+pO%(Q&nt1PGintTlG{vO`&1T3>?O#vW#*8W2t=K53+epn%jhQ$zUz zqpEL^p?8UqmINXN@aMM7N}eA5JA7q{kzRrzsQ4Anm-n-q!TGE*<5D(!Hx4azP~Y`m zZyqDcKT_zJyYEn%^>?FGKon>KRG^(#aC9mgn?^!>pH6(P-%cmK(Akx%$Xzf>TB|JH z8QeQafMz51%>?T7s-Uv6EBi6#k5)UK`0fhO!P0|r zQgeJF-B3RW01`YAF1y%&_CK$>OMchMp^3b`Ne|qts2nGQN`m}M+Q|`;v&6{lja{eH zHOX)MEv1N0LelbR;KN7Y!TnbFSy0)wr-yV+r9y7`JeBjuv^*rowIYEo6{+t+! zXoK^TuRGd9T{)f*rbIlV(>IA}xh6hYPV43qV!_Ela|N=+BZ;4!^rrgPEnDAX+gDNv zK;XuVCD1!zq4sQrM+RBda|h~Chv^K)}k}T0DQSR>Ok!JLowa4r?J)ES%`+F z#t7(46G_WssBgC)vg18dTn|2vpQ(8><;WB+ana*H-n%=iupHq>_)p6OAZH<$XGNwu za$nZ@qX_@vFlsKWID5v<>E`NT!*YqJ0l{cF-l?LL06kyFt3d&+e0YpYOj@Lt*59-w zJqZQ{`D~;lk^(bb3_i`GtLd5vXcFjAC4Sonlc}Qfc{pHx5>OzOORbN<%@)b5P0Od2 z^(dp=VGL^{C?zPJN+CPI_FHR^M;uO?zJaSMJ?e#u2HK3h(kNX3oA5!iEwZbZEd5Mi zSiReLuL z8vM&TYCf!1ab=N%hQ@*Gzik0P4vagWoB(1^=UaJT|De>EM-V*Jw`Di)Qpg3}Rz0{O zmlXq33!@LA@PmNKf@`fo5%E>_`SQd0*9!4(m*&?i&DU$7qx@yS4@(xADI{3?DY{S2J+$S(CX!c?>H$9u7jKm8(IiQ9dp zesS3sS?r`oek~kCG#NvO$Dy{7Rs_Pk5W8Gj|Jvp+@JYnZOR|lK7ngOrSGaRtk*KeI)!d{(GnH^p`5{tjApwa@ zY}}DsSpp2r5jc>%vjFbUjWuzj>It(t6X;iydxEQa`$(d3&8n9Qg5Zo&-3VrK>3so) z<0?7!&FWEl?agpMg@3bHENaQST(h8E-{8a182_>+0FJ5F;1fZY0y*&jFrYqURXKXA z!yLM+Q%=ue-ku2NE1lBK5o9!(Y?jZRPW(T?+tR5CC+%)a7aiIiK0JF@IY%!8;-?<~ z30%t;R&#k2R)i7sl%!`&k`R{t47~hua4%uByheTHM5Wb@KGH~D_gV(LF=r)t9phQs zcsX{|IC|1ba3SX$0Af&_HSIaL$=wtCpFLrLd%j{O$mhbr!WE9Y16OpnBNj-s3#UCp ziKOrIG2LD~)4C=TQO17+XXG5@<74Cc$^5LR#cVvc9ik8)Fo?yxM}Q_18HP4Pz2}4k zfQJB4HrdoVTx=9S&W;=Mn+*$%BR5`-V0VunSI_D-f6bCM>Smeo6d33)&y*;X*W?n3 z{?d*5WCh&YaQm>~)Y!N4*TG{`v{XD&1u|f@XW-GpmRu*nu(3IN+5GIb5Zyy48r0R! z{O|3>?4IT}JMJ3o?Sg9%O%di5iKMxeEb>vxCfIj_8vqeu#W%N*MSMKY;P9GG4jL=w ztoifVi=nq|H<0hit?gw**LzoF(@<% z)L(zkNGk)Ij(-rAy#MS44ciZFbVuzj*eFOxy{%r z_RWohr>b%IE{&v1@5f_;*_j&M_UZ~h4AK>@ z4x&r;`Af;xp@>j@2`k4!V9(PwAAZ*y5vcJCg~{BkS!J~ zE$c3pa!XT0QHSlZ&SSQZ9NCzVvLr5mIok!`=PKilpR3OANQG-axOuV)G=vNs0l+o8 zv+$!^GH(28{m|+XP+5AEHOd#Hr5>EtmO2#v) z714=CN8?us)Ay#Hd?j5|`3lff+Gu!oSnFKJ%MF6M3s0-$Fu{$qJTNW&)*XD?E47i* zF+h!)umlvHw%mmPFg4WF{sRxs@P+E8K+6#V_&Utr+K|vQK6jWE4r8dHmQ5=67JGQ_V;-=6W! za+!7fF?Do*^4;+f(Qtx7#qnvEnGWU5k3Zdr0mwgb_DP2m1ZESe`%Y7JZhLXB)#PRA zfVjde*8tyer^+m=Ep+k_c~~S8KZTXznxe?;kgdm_#;`kU^x6d1Hk&7p` z$^XQ-Q?ZM(ICi(PZ59&8giQ(20cC~Emyt7u=-+sB<%us`G)d6-F?Pd!9n?kPuT+KV zZS%Pl5D#oN2<_(%J|Vh=#GNkP1n&`+F}6#vVemi#t@G^?--5?%ZmliBw*+ySTV;2p zu=eb3FOFzm^2rZBEov<*Of}nQ1mjko_|hG=wx<`%x7gjO)s?N!SYr3oLUarA-;(sm zYHQ+~3~-&Vw7J}3yh8Zyaj$P^aTLe>0|y1wrGF0B$heU3n;*$w;^PjEf-rjrwIjWM zl<{-ce`bx3Vj8+5ub3jKYIb}PjPPunx7~gO9L2FLIP@IqDFtN3m{4ilJAntq?)?1P zk={Sb_&Mvpb;d`70>98kvpf3Ijwu!xgWg(T1o+~ZyeuUPcDL@S1d4KsjZd#r0(v>K zGyYp=eB?7tGKp_>p9@UaHR(OSH`iY-%=W7iSCcw(TR}sW^H{uYCkO zgAwY#&5VysB}p=gU3m~Rv2DFPK|A%V9oxF^85%5$TJ*C$!03JfP%xEcXZ k#nDrGU5%H!`U~;@|I<;avqnM8egFUf07*qoM6N<$g7dU1M*si- diff --git a/10-regular-expressions-javascript/3-regexp-character-classes/hello-java-boundaries@2x.png b/10-regular-expressions-javascript/3-regexp-character-classes/hello-java-boundaries@2x.png deleted file mode 100644 index e8f14d87adc476d2cc25c6615adfb32fadda8e78..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6841 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 diff --git a/10-regular-expressions-javascript/3-regexp-character-classes/love-html5-classes.png b/10-regular-expressions-javascript/3-regexp-character-classes/love-html5-classes.png deleted file mode 100644 index 387fac9da647dae06f789e9ca6780872f981a5a7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4722 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 Mlm*GuNSTHFKb?pBp#T5? diff --git a/10-regular-expressions-javascript/4-regexp-character-sets-and-ranges/1-find-range-1/solution.md b/10-regular-expressions-javascript/4-regexp-character-sets-and-ranges/1-find-range-1/solution.md deleted file mode 100644 index 6177c8e6..00000000 --- a/10-regular-expressions-javascript/4-regexp-character-sets-and-ranges/1-find-range-1/solution.md +++ /dev/null @@ -1,18 +0,0 @@ -Ответы: **нет, да**. - -
      -
    • В строке Java он ничего не найдёт, так как исключающие квадратные скобки в `Java[^...]` означают "один символ, кроме указанных". А после "Java" -- конец строки, символов больше нет. - -```js -//+ run -alert( "Java".match(/Java[^script]/) ); // нет совпадений -``` -
    • -
    • Да, найдёт. Поскольку регэксп регистрозависим, то под `[^script]` вполне подходит символ `"S"`. - -```js -//+ run -alert( "JavaScript".match(/Java[^script]/) ); // "JavaS" -``` -
    • -
    diff --git a/10-regular-expressions-javascript/4-regexp-character-sets-and-ranges/1-find-range-1/task.md b/10-regular-expressions-javascript/4-regexp-character-sets-and-ranges/1-find-range-1/task.md deleted file mode 100644 index 6f0b0e37..00000000 --- a/10-regular-expressions-javascript/4-regexp-character-sets-and-ranges/1-find-range-1/task.md +++ /dev/null @@ -1,5 +0,0 @@ -# Java[^script] - -Найдет ли регэксп /Java[^script]/ что-нибудь в строке Java? - -А в строке JavaScript? diff --git a/10-regular-expressions-javascript/4-regexp-character-sets-and-ranges/2-find-time-2-formats/solution.md b/10-regular-expressions-javascript/4-regexp-character-sets-and-ranges/2-find-time-2-formats/solution.md deleted file mode 100644 index 969966a2..00000000 --- a/10-regular-expressions-javascript/4-regexp-character-sets-and-ranges/2-find-time-2-formats/solution.md +++ /dev/null @@ -1,9 +0,0 @@ -Ответ: \d\d[-:]\d\d. - -```js -//+ run -var re = /\d\d[-:]\d\d/g; -alert( "Завтрак в 09:00. Обед - в 21-30".match(re) ); -``` - -Обратим внимание, что дефис '-' не экранирован, поскольку в начале скобок он не может иметь специального смысла. diff --git a/10-regular-expressions-javascript/4-regexp-character-sets-and-ranges/2-find-time-2-formats/task.md b/10-regular-expressions-javascript/4-regexp-character-sets-and-ranges/2-find-time-2-formats/task.md deleted file mode 100644 index dd03af58..00000000 --- a/10-regular-expressions-javascript/4-regexp-character-sets-and-ranges/2-find-time-2-formats/task.md +++ /dev/null @@ -1,11 +0,0 @@ -# Найдите время в одном из форматов - -Время может быть в формате `часы:минуты` или `часы-минуты`. И часы и минуты состоят из двух цифр, например `09:00`, `21-30`. - -Напишите регулярное выражение для поиска времени: - -```js -var re = /ваше выражение/; -alert( "Завтрак в 09:00. Обед - в 21-30".match(re) ); // 09:00, 21-30 -``` - diff --git a/10-regular-expressions-javascript/4-regexp-character-sets-and-ranges/article.md b/10-regular-expressions-javascript/4-regexp-character-sets-and-ranges/article.md deleted file mode 100644 index c8f2041f..00000000 --- a/10-regular-expressions-javascript/4-regexp-character-sets-and-ranges/article.md +++ /dev/null @@ -1,170 +0,0 @@ -# Наборы и диапазоны [...] - -Если в регулярном выражении несколько символов или символьных классов заключены в квадратные скобки `[…]`, то это означает "искать любой символ из указанных в `[…]`". - -[cut] - -## Набор - -Например, [еао] означает любой символ из этих трёх: `'а'`, `'е'`, или `'о'`. - -Такое обозначение называют *набором*. Наборы используются в регулярном выражении наравне с обычными символами: - -```js -//+ run -// найти [г или т], а затем "оп" -alert( "Гоп-стоп".match(/[гт]оп/gi) ); // "Гоп", "топ" -``` - -Обратим внимание: несмотря на то, что в наборе указано несколько символов, в совпадении должен присутствовать *ровно один* из них. - -Поэтому в примере ниже нет результатов: - -```js -//+ run -// найти "В", затем [у или а], затем "ля" -alert( "Вуаля".match(/В[уа]ля/) ); // совпадений нет -``` - -Поиск подразумевает: -
      -
    • В,
    • -
    • затем *одну* из букв набора [уа],
    • -
    • а затем ля
    • -
    - -Таким образом, совпадение было бы для строки Вуля или Валя. - -## Диапазоны - -Квадратные скобки могут также содержать *диапазоны символов*. - -Например, [a-z] -- произвольный символ от `a` до `z`, [0-5] -- цифра от `0` до `5`. - -В примере ниже мы будем искать `"x"`, после которого идёт два раза любая цифра или буква от A до F: - -```js -//+ run -// найдёт "xAF" -alert( "Exception 0xAF".match(/x[0-9A-F][0-9A-F]/g) ); -``` - -Обратим внимание, в слове Exception есть сочетание xce, но оно не подошло, потому что буквы в нём маленькие, а в диапазоне [0-9A-F] -- большие. - -Если хочется искать и его тоже, можно добавить в скобки диапазон `a-f`: [0-9A-Fa-f]. Или же просто указать у всего регулярного выражения флаг `i`. - -**Символьные классы -- всего лишь более короткие записи для диапазонов, в частности:** - -
      -
    • **\d** -- то же самое, что [0-9],
    • -
    • **\w** -- то же самое, что [a-zA-Z0-9_],
    • -
    • **\s** -- то же самое, что [\t\n\v\f\r ] плюс несколько юникодных пробельных символов.
    • -
    - -В квадратных скобках можно использовать и диапазоны и символьные классы -- вместе. - -Например, нам нужно найти все слова в тексте. Если они на английском -- это достаточно просто: - -```js -//+ run -var str = "The sun is rising!"; - -alert( str.match(/\w+/g) ); // The, sun, is, rising*!* -``` - -А если есть слова и на русском? - -```js -//+ run -var str = "Солнце встаёт!"; - -alert( str.match(/\w+/g) ); // null*!* -``` - -Ничего не найдено! Это можно понять, ведь \w -- это именно английская букво-цифра, как можно видеть из аналога [a-zA-Z0-9_]. - -Чтобы находило слово на русском -- нужно использовать диапазон, например /[а-я]/. - -А чтобы на обоих языках -- и то и другое вместе: - -```js -//+ run -var str = "Солнце (the sun) встаёт!"; - -alert( str.match(/[\wа-я]+/gi) ); // Солнце, the, sun, вста, т*!* -``` - -...Присмотритесь внимательно к предыдущему примеру! Вы видите странность? Оно не находит букву ё, более того -- считает её разрывом в слове. Причина -- в кодировке юникод, она подробно раскрыта в главе [](/string). - -Буква `ё` лежит в стороне от основной кириллицы и её следует добавить в диапазон дополнительно, вот так: - -```js -//+ run -var str = "Солнце (the sun) встаёт!"; - -alert( str.match(/[\wа-яё]+/gi) ); // Солнце, the, sun, встаёт*!* -``` - -Теперь всё в порядке. - -## Диапазоны "кроме" - -**Кроме обычных, существуют также *исключающие* диапазоны: [^…].** - -Квадратные скобки, начинающиеся со знака каретки: [^…] находят любой символ, *кроме указанных*. - -Например: - -
      -
    • [^аеуо] -- любой символ, кроме `'a'`, `'e'`, `'y'`, `'o'`.
    • -
    • [^0-9] -- любой символ, кроме цифры, то же что `\D`.
    • -
    • [^\s] -- любой не-пробельный символ, то же что `\S`.
    • -
    - -Пример ниже ищет любые символы, кроме букв, цифр и пробелов: - -```js -//+ run -alert( "alice15@gmail.com".match(/[^\d\sA-Z]/gi) ); // "@", "." -``` - -## Не нужно экранирование - -Обычно, если мы хотим искать именно точку, а не любой символ, или именно символ `\`, то мы используем экранирование: указываем `\.` или `\\`. - -В квадратных скобках большинство специальных символов можно использовать без экранирования, если конечно они не имеют какой-то особый смысл именно внутри квадратных скобок. - -То есть, "как есть", без экранирования можно использовать символы: -
      -
    • Точка '.'.
    • -
    • Плюс '+'.
    • -
    • Круглые скобки '( )'.
    • -
    • Дефис '-', если он находится в начале или конце квадратных скобок, то есть не выделяет диапазон.
    • -
    • Символ каретки '^', если не находится в начале квадратных скобок.
    • -
    • А также открывающая квадратная скобка '['.
    • -
    - -То есть, точка `"."` в квадратных скобках означает не "любой символ", а обычную точку. - -Регэксп [.,] ищет один из символов "точка" или "запятая". - -В примере ниже регэксп [-().^+] ищет один из символов `-().^`. Они не экранированы: - -```js -//+ run -// Без экранирования -var re = /[-().^+]/g; - -alert( "1 + 2 - 3".match(re) ); // найдёт +, - -``` - -...Впрочем, даже если вы решите "на всякий случай" заэкранировать эти символы, поставив перед ними обратный слэш `\` -- вреда не будет: - -```js -//+ run -// Всё заэкранировали -var re = /[\-\(\)\.\^\+]/g; - -alert( "1 + 2 - 3".match(re) ); // тоже работает: +, - -``` - diff --git a/10-regular-expressions-javascript/5-regexp-quantifiers/1-find-text-manydots/solution.md b/10-regular-expressions-javascript/5-regexp-quantifiers/1-find-text-manydots/solution.md deleted file mode 100644 index 5108d628..00000000 --- a/10-regular-expressions-javascript/5-regexp-quantifiers/1-find-text-manydots/solution.md +++ /dev/null @@ -1,11 +0,0 @@ - -Решение: - -```js -//+ run -var reg = /\.{3,}/g; -alert( "Привет!... Как дела?.....".match(reg) ); // ..., ..... -``` - -Заметим, что символ `.` является специальным, значит его надо экранировать, то есть вставлять как `\.`. - diff --git a/10-regular-expressions-javascript/5-regexp-quantifiers/1-find-text-manydots/task.md b/10-regular-expressions-javascript/5-regexp-quantifiers/1-find-text-manydots/task.md deleted file mode 100644 index 4e94ba20..00000000 --- a/10-regular-expressions-javascript/5-regexp-quantifiers/1-find-text-manydots/task.md +++ /dev/null @@ -1,13 +0,0 @@ -# Как найти многоточие... ? - -[importance 5] - -Напишите регулярное выражения для поиска многоточий: трёх или более точек подряд. - -Проверьте его: - -```js -var reg = /ваше выражение/g; -alert( "Привет!... Как дела?.....".match(reg) ); // ..., ..... -``` - diff --git a/10-regular-expressions-javascript/5-regexp-quantifiers/2-find-html-colors-6hex/solution.md b/10-regular-expressions-javascript/5-regexp-quantifiers/2-find-html-colors-6hex/solution.md deleted file mode 100644 index 09576d99..00000000 --- a/10-regular-expressions-javascript/5-regexp-quantifiers/2-find-html-colors-6hex/solution.md +++ /dev/null @@ -1,34 +0,0 @@ -Итак, нужно написать выражение для описания цвета, который начинается с "#", за которым следуют 6 шестнадцатеричных символов. - -Шестнадцатеричный символ можно описать с помощью [0-9a-fA-F]. Мы можем сократить выражение, используя не чувствительный к регистру шаблон [0-9a-f]. - -Для его шестикратного повторения мы будем использовать квантификатор {6}. - -В итоге, получаем выражение вида /#[a-f0-9]{6}/gi. - -```js -//+ run -var re = /#[a-f0-9]{6}/gi; - -var str = "color:#121212; background-color:#AA00ef bad-colors:f#fddee #fd2"; - -alert( str.match(re) ); // #121212,#AA00ef -``` - -Проблема этого выражения в том, что оно находит цвет и в более длинных последовательностях: - -```js -//+ run -alert( "#12345678".match( /#[a-f0-9]{6}/gi ) ) // #12345678 -``` - -Чтобы такого не было, можно добавить в конец `\b`: - -```js -//+ run -// цвет -alert( "#123456".match( /#[a-f0-9]{6}\b/gi ) ); // #123456 - -// не цвет -alert( "#12345678".match( /#[a-f0-9]{6}\b/gi ) ); // null -``` diff --git a/10-regular-expressions-javascript/5-regexp-quantifiers/2-find-html-colors-6hex/task.md b/10-regular-expressions-javascript/5-regexp-quantifiers/2-find-html-colors-6hex/task.md deleted file mode 100644 index ea2dbf18..00000000 --- a/10-regular-expressions-javascript/5-regexp-quantifiers/2-find-html-colors-6hex/task.md +++ /dev/null @@ -1,14 +0,0 @@ -# Регулярное выражение для цвета - -Напишите регулярное выражение для поиска HTML-цвета, заданного как `#ABCDEF`, то есть `#` и содержит затем 6 шестнадцатеричных символов. - -Пример использования: - -``` -var re = /*...ваше регулярное выражение...*/ - -var str = "color:#121212; background-color:#AA00ef bad-colors:f#fddee #fd2" - -alert( str.match(re) ) // #121212,#AA00ef -``` - diff --git a/10-regular-expressions-javascript/5-regexp-quantifiers/3-find-decimal-positive-numbers/solution.md b/10-regular-expressions-javascript/5-regexp-quantifiers/3-find-decimal-positive-numbers/solution.md deleted file mode 100644 index 41f71b50..00000000 --- a/10-regular-expressions-javascript/5-regexp-quantifiers/3-find-decimal-positive-numbers/solution.md +++ /dev/null @@ -1,18 +0,0 @@ - - -Целое число -- это \d+. - -Десятичная точка с дробной частью -- \.\d+. - -Она не обязательна, так что обернём её в скобки с квантификатором '?'. - -Итого, получилось регулярное выражение \d+(\.\d+)?: - -```js -//+ run -var re = /\d+(\.\d+)?/g - -var str = "1.5 0 12. 123.4."; - -alert( str.match(re) ); // 1.5, 0, 12, 123.4 -``` diff --git a/10-regular-expressions-javascript/5-regexp-quantifiers/3-find-decimal-positive-numbers/task.md b/10-regular-expressions-javascript/5-regexp-quantifiers/3-find-decimal-positive-numbers/task.md deleted file mode 100644 index 17e4d836..00000000 --- a/10-regular-expressions-javascript/5-regexp-quantifiers/3-find-decimal-positive-numbers/task.md +++ /dev/null @@ -1,13 +0,0 @@ -# Найдите положительные числа - -Создайте регэксп, который ищет все положительные числа, в том числе и с десятичной точкой. - -Пример использования: - -```js -var re = /* ваш регэксп */ - -var str = "1.5 0 12. 123.4."; - -alert( str.match(re) ); // 1.5, 0, 12, 123.4 -``` \ No newline at end of file diff --git a/10-regular-expressions-javascript/5-regexp-quantifiers/4-find-decimal-numbers/solution.md b/10-regular-expressions-javascript/5-regexp-quantifiers/4-find-decimal-numbers/solution.md deleted file mode 100644 index 2abd91c0..00000000 --- a/10-regular-expressions-javascript/5-regexp-quantifiers/4-find-decimal-numbers/solution.md +++ /dev/null @@ -1,13 +0,0 @@ -Целое число с необязательной дробной частью -- это \d+(\.\d+)?. - -К этому нужно добавить необязательный `-` в начале: - - -```js -//+ run -var re = /-?\d+(\.\d+)?/g - -var str = "-1.5 0 2 -123.4."; - -alert( str.match(re) ); // -1.5, 0, 2, -123.4 -``` diff --git a/10-regular-expressions-javascript/5-regexp-quantifiers/4-find-decimal-numbers/task.md b/10-regular-expressions-javascript/5-regexp-quantifiers/4-find-decimal-numbers/task.md deleted file mode 100644 index 5c5d4d09..00000000 --- a/10-regular-expressions-javascript/5-regexp-quantifiers/4-find-decimal-numbers/task.md +++ /dev/null @@ -1,13 +0,0 @@ -# Найдите десятичные числа - -Создайте регэксп, который ищет все числа, в том числе и с десятичной точкой, в том числе и отрицательные. - -Пример использования: - -```js -var re = /* ваш регэксп */ - -var str = "-1.5 0 2 -123.4."; - -alert( str.match(re) ); // -1.5, 0, 2, -123.4 -``` \ No newline at end of file diff --git a/10-regular-expressions-javascript/5-regexp-quantifiers/article.md b/10-regular-expressions-javascript/5-regexp-quantifiers/article.md deleted file mode 100644 index 17605289..00000000 --- a/10-regular-expressions-javascript/5-regexp-quantifiers/article.md +++ /dev/null @@ -1,168 +0,0 @@ -# Квантификаторы +, *, ? и {n} - -Рассмотрим ту же задачу, что и ранее -- взять телефон вида `+7(903)-123-45-67` и найти все числа в нём. Но теперь нас интересуют не цифры по отдельности, а именно числа, то есть результат вида `7, 903, 123, 45, 67`. - -Для поиска цифр по отдельности нам было достаточно класса `\d`. Но здесь нужно искать *числа* -- последовательности из 1 или более цифр. - -## Количество {n} - -Количество повторений символа можно указать с помощью числа в фигурных скобках: `{n}`. - -Такое указание называют *квантификатором* (от англ. quantifier). - -У него есть несколько подформ записи: - -
    -
    Точное количество: `{5}`
    -
    Регэксп \d{5} обозначает ровно 5 цифр, в точности как \d\d\d\d\d. - -Следующий пример находит пятизначное число. - -```js -//+ run -alert( "Мне 12345 лет".match(/\d{5}/) ); // "12345" -``` - -
    -
    Количество от-до: `{3,5}`
    -
    Для того, чтобы найти, например, числа размером от трёх до пяти знаков, нужно указать границы в фигурных скобках: \d{3,5} - -```js -//+ run -alert( "Мне не 12, а 1234 года".match(/\d{3,5}/) ); // "1234" -``` - -Последнее значение можно и не указывать. Тогда выражение \d{3,} найдет числа, длиной от трех цифр: - -```js -//+ run -alert( "Мне не 12, а 345678 лет".match(/\d{3,5}/) ); // "345678" -``` -
    -
    - -В случае с телефоном нам нужны числа -- одна или более цифр подряд. Этой задаче соответствует регулярное выражение \d{1,}: - -```js -//+ run -var str = "+7(903)-123-45-67"; - -alert( str.match(/\d{1,}/g) ); // 7,903,123,45,67 -``` - - -## Короткие обозначения - -Для самые часто востребованных квантификаторов есть специальные короткие обозначения. - -
    -
    `+`
    -
    Означает "один или более", то же что `{1,}`. - -Например, \d+ находит числа -- последовательности из 1 или более цифр: - -```js -//+ run -var str = "+7(903)-123-45-67"; - -alert( str.match(/\d+/g) ); // 7,903,123,45,67 -``` - -
    -
    `?`
    -
    Означает "ноль или один", то же что и `{0,1}`. По сути, делает символ необязательным. - -Например, регэксп ou?r найдёт o, после которого, возможно, следует u, а затем r. - -Этот регэксп найдёт or в слове color и our в colour: - -```js -//+ run -var str = "Можно писать color или colour (британский вариант)"; - -alert( str.match(/colou?r/g) ); // color, colour -``` - -
    -
    `*`
    -
    Означает "ноль или более", то же что `{0,}`. То есть, символ может повторяться много раз или вообще отсутствовать. - -Пример ниже находит цифру, после которой идёт один или более нулей: - -```js -//+ run -alert( "100 10 1".match(/\d0*/g) ); // 100, 10, 1 -``` - -Сравните это с `'+'` (один или более): - -```js -//+ run -alert( "100 10 1".match(/\d0+/g) ); // 100, 10 -``` - -
    -
    - -## Ещё примеры - -Эти квантификаторы принадлежат к числу самых важных "строительных блоков" для сложных регулярных выражений, поэтому мы рассмотрим ещё примеры. - -
    -
    Регэксп "десятичная дробь" (число с точкой внутри): \d+\.\d+
    -
    - -В действии: -```js -//+ run -alert( "0 1 12.345 7890".match(/\d+\.\d+/g) ); // 12.345 -``` - -
    -
    Регэксп "открывающий HTML-тег без атрибутов", такой как `` или `

    `: /<[a-z]+>/i

    -
    Пример: - -```js -//+ run -alert( " ... ".match(/<[a-z]+>/gi) ); // -``` - -Это регулярное выражение ищет символ '<', за которым идут одна или более букв английского алфавита, и затем '>'. -
    -
    Регэксп "открывающий HTML-тег без атрибутов" (лучше): /<[a-z][a-z0-9]*>/i
    -
    -Здесь регулярное выражение расширено: в соответствие со стандартом, HTML-тег может иметь символ на любой позиции, кроме первой, например `

    `. - -```js -//+ run -alert( "

    Привет!

    ".match(/<[a-z][a-z0-9]*>/gi) ); //

    -``` - -

    -
    Регэксп "открывающий или закрывающий HTML-тег без атрибутов": /<\/?[a-z][a-z0-9]*>/i
    -
    В предыдущий паттерн добавили необязательный слэш /? перед тегом. Его понадобилось заэкранировать, чтобы JavaScript не принял его за конец шаблона. - -```js -//+ run -alert( "

    Привет!

    ".match(/<\/?[a-z][a-z0-9]*>/gi) ); //

    ,

    -``` - -
    -
    - - -[smart header="Точнее -- значит сложнее"] -В этих примерах мы видим общее правило, которое повторяется из раза в раз: чем точнее регулярное выражение, тем оно длиннее и сложнее. - -Например, для HTML-тегов, скорее всего, подошло бы и более короткое регулярное выражение <\w+>. - -Так как класс `\w` означает "любая цифра или английская буква или `'_'`, то под такой регэксп подойдут и не теги, например <_>. Однако он гораздо проще, чем более точный регэксп <[a-z][a-z0-9]*>. - -Подойдёт ли нам <\w+> или нужно использовать именно <[a-z][a-z0-9]*>? - -В реальной жизни допустимы оба варианта. Ответ на подобные вопросы зависит от того, насколько реально важна точность и насколько сложно потом будет отфильтровать лишние совпадения (если появятся). -[/smart] - - - - diff --git a/10-regular-expressions-javascript/6-regexp-greedy-and-lazy/1-lazy-greedy/solution.md b/10-regular-expressions-javascript/6-regexp-greedy-and-lazy/1-lazy-greedy/solution.md deleted file mode 100644 index 083b3044..00000000 --- a/10-regular-expressions-javascript/6-regexp-greedy-and-lazy/1-lazy-greedy/solution.md +++ /dev/null @@ -1,6 +0,0 @@ - -Результат: `123 456`. - -Ленивый `\d+?` будет брать цифры до пробела, то есть `123`. После каждой цифры он будет останавливаться, проверять -- не пробел ли дальше? Если нет -- брать ещё цифру, в итоге возьмёт `123`. - -З в дело вступит `\d+`, который по-максимуму возьмёт дальнейшие цифры, то есть `456`. \ No newline at end of file diff --git a/10-regular-expressions-javascript/6-regexp-greedy-and-lazy/1-lazy-greedy/task.md b/10-regular-expressions-javascript/6-regexp-greedy-and-lazy/1-lazy-greedy/task.md deleted file mode 100644 index 7076396f..00000000 --- a/10-regular-expressions-javascript/6-regexp-greedy-and-lazy/1-lazy-greedy/task.md +++ /dev/null @@ -1,8 +0,0 @@ -# Совпадение для /d+? d+/ - -Что будет при таком поиске, когда сначало стоит ленивый, а потом жадный квантификаторы? - -```js -"123 456".match(/\d+? \d+/g) ); // какой результат? -``` - diff --git a/10-regular-expressions-javascript/6-regexp-greedy-and-lazy/2-difference-find-quote/solution.md b/10-regular-expressions-javascript/6-regexp-greedy-and-lazy/2-difference-find-quote/solution.md deleted file mode 100644 index b47d89b3..00000000 --- a/10-regular-expressions-javascript/6-regexp-greedy-and-lazy/2-difference-find-quote/solution.md +++ /dev/null @@ -1,16 +0,0 @@ -Они очень похожи и, да, *почти* одинаковы. Оба ищут от одной кавычки до другой. - -Различие здесь в символе точка '.'. Как мы помним, точка '.' обозначает *любой символ, кроме перевода строки*. - -А [^"] -- это *любой символ, кроме кавычки '"'. - -Получатся, что первый регэксп "[^"]*" найдёт закавыченные строки с `\n` внутри, а второй регэксп ".*?" -- нет. - -Вот пример: -```js -//+ run -alert( '"многострочный \n текст"'.match(/"[^"]*"/) ); // найдёт - -alert( '"многострочный \n текст"'.match(/".*?"/) ); // null (нет совпадений) -``` - diff --git a/10-regular-expressions-javascript/6-regexp-greedy-and-lazy/2-difference-find-quote/task.md b/10-regular-expressions-javascript/6-regexp-greedy-and-lazy/2-difference-find-quote/task.md deleted file mode 100644 index 5e9dcf17..00000000 --- a/10-regular-expressions-javascript/6-regexp-greedy-and-lazy/2-difference-find-quote/task.md +++ /dev/null @@ -1,5 +0,0 @@ -# Различие между "[^"]*" и ".*?" - -Регулярные выражения "[^"]*" и ".*?" -- при выполнении одинаковы? - -Иначе говоря, существует ли такая строка, на которой они дадут разные результаты? Если да -- дайте такую строку. diff --git a/10-regular-expressions-javascript/6-regexp-greedy-and-lazy/3-find-html-comments/solution.md b/10-regular-expressions-javascript/6-regexp-greedy-and-lazy/3-find-html-comments/solution.md deleted file mode 100644 index 17bf43eb..00000000 --- a/10-regular-expressions-javascript/6-regexp-greedy-and-lazy/3-find-html-comments/solution.md +++ /dev/null @@ -1,18 +0,0 @@ -Нужно найти начало комментария <!--, затем всё до конца -->. - -С первого взгляда кажется, что это сделает регулярное выражение <!--.*?--> -- квантификатор сделан ленивым, чтобы остановился, достигнув -->. - -Однако, точка в JavaScript -- любой символ, *кроме* конца строки. Поэтому такой регэксп не найдёт многострочный комментарий. - -Всё получится, если вместо точки использовать полностю "всеядный" [\s\S]. - -Итого: - -```js -//+ run -var re = //g; - -var str = '.. .. .. '; - -alert( str.match(re) ); // '', '' -``` \ No newline at end of file diff --git a/10-regular-expressions-javascript/6-regexp-greedy-and-lazy/3-find-html-comments/task.md b/10-regular-expressions-javascript/6-regexp-greedy-and-lazy/3-find-html-comments/task.md deleted file mode 100644 index af0b1b2a..00000000 --- a/10-regular-expressions-javascript/6-regexp-greedy-and-lazy/3-find-html-comments/task.md +++ /dev/null @@ -1,11 +0,0 @@ -# Найти HTML-комментарии - -Найдите все HTML-комментарии в тексте: - -```js -var re = ..ваш регэксп.. - -var str = '.. .. .. '; - -alert( str.match(re) ); // '', '' -``` diff --git a/10-regular-expressions-javascript/6-regexp-greedy-and-lazy/4-find-html-tags-greedy-lazy/solution.md b/10-regular-expressions-javascript/6-regexp-greedy-and-lazy/4-find-html-tags-greedy-lazy/solution.md deleted file mode 100644 index 6a87a597..00000000 --- a/10-regular-expressions-javascript/6-regexp-greedy-and-lazy/4-find-html-tags-greedy-lazy/solution.md +++ /dev/null @@ -1,38 +0,0 @@ -Начнём поиск с <, затем один или более произвольный символ, но до закрывающего "уголка": .+?>. - -Проверим, как работает этот регэксп: - -```js -//+ run -var re = /<.+?>/g; - -var str = '<>
    '; - -alert( str.match(re) ); // <> , , -``` - -Результат неверен! В качестве первого тега регэксп нашёл подстроку <> <a href="/">, но это явно не тег. - -Всё потому, что .+? -- это "любой символ (кроме `\n`), повторяющийся один и более раз до того, как оставшаяся часть шаблона совпадёт (ленивость)". - -Поэтому он находит первый `<`, затем есть "всё подряд" до следующего `>`. - -Первое совпадение получается как раз таким: - -``` -<.............> -<> -``` - -Правильным решением будет использовать <[^>]+>: - -```js -//+ run -var re = /<[^>]+>/g - -var str = '<> '; - -alert( str.match(re) ); // , , -``` - -Это же решение автоматически позволяет находится внутри тегу символу `\n`, который в класс точка `.` не входит. \ No newline at end of file diff --git a/10-regular-expressions-javascript/6-regexp-greedy-and-lazy/4-find-html-tags-greedy-lazy/task.md b/10-regular-expressions-javascript/6-regexp-greedy-and-lazy/4-find-html-tags-greedy-lazy/task.md deleted file mode 100644 index 43935130..00000000 --- a/10-regular-expressions-javascript/6-regexp-greedy-and-lazy/4-find-html-tags-greedy-lazy/task.md +++ /dev/null @@ -1,18 +0,0 @@ -# Найти HTML-теги - -Создайте регулярное выражение для поиска всех (открывающихся и закрывающихся) HTML-тегов вместе с атрибутами. - -Пример использования: -```js -//+ run -var re = /* ваш регэксп */ - -var str = '<> '; - -alert( str.match(re) ); // '', '', '' -``` - -В этой задаче можно считать, что тег начинается с <, заканчивается > и может содержать внутри любые символы, кроме < и >. - -Но хотя бы один символ внутри тега должен быть: <> -- не тег. - diff --git a/10-regular-expressions-javascript/6-regexp-greedy-and-lazy/article.md b/10-regular-expressions-javascript/6-regexp-greedy-and-lazy/article.md deleted file mode 100644 index 09758bab..00000000 --- a/10-regular-expressions-javascript/6-regexp-greedy-and-lazy/article.md +++ /dev/null @@ -1,335 +0,0 @@ -# Жадные и ленивые квантификаторы - -Квантификаторы -- с виду очень простая, но на самом деле очень хитрая штука. - -Необходимо очень хорошо понимать, как именно происходит поиск, если конечно мы хотим искать что-либо сложнее чем /\d+/. - -[cut] - -Для примера рассмотрим задачу, которая часто возникает в типографике -- заменить в тексте кавычки вида `"..."` (их называют "английские кавычки") на "кавычки-ёлочки": `«...»`. - -Для этого нужно сначала найти все слова в таких кавычках. - -Соотверствующее регулярное выражение может выглядеть так: /".+"/g, то есть мы ищем кавычку, после которой один или более произвольный символ, и в конце опять кавычка. - -Однако, если попробовать применить его на практике, даже на таком простом случае... - -```js -//+ run -var reg = /".+"/g; - -var str = 'a "witch" and her "broom" is one'; - -alert( str.match(reg) ); // "witch" and her "broom" -``` - -...Мы увидим, что оно работает совсем не так, как задумано! - -Вместо того, чтобы найти два совпадения "witch" и "broom", оно находит одно: "witch" and her "broom". - -Это как раз тот случай, когда *жадность* -- причина всех зол. - -## Жадный поиск - -Чтобы найти совпадение, движок регулярных выражений обычно использует следующий алгоритм: - -
      -
    • Для каждой позиции в поисковой строке -
        -
      • Проверить совпадение на данной позиции -
        • Посимвольно, с учётом классов и квантификаторов сопоставив с ней регулярное выражение.
        -
      • -
      -
    • -
    - -Это общие слова, гораздо понятнее будет, если мы проследим, что именно он делает для регэкспа ".+". - -
      -
    1. Первый символ шаблона -- это кавычка ". - -Движок регулярных выражений пытается сопоставить её на 0й позиции в строке, но символ `a`, поэтому на 0й позиции соответствия явно нет. - -Далее он переходит 1ю, 2ю позицию в исходной строке и, наконец, обнаруживает кавычку на 3й позиции: - -
    2. -
    3. Кавычка найдена, далее движок проверяет, есть ли соответствие для остальной части паттерна. - -В данном случае следующий символ шаблона: . (точка). Она обозначает "любой символ", так что следующая буква строки 'w' вполне подходит: - -
    4. -
    5. Далее "любой символ" повторяется, так как стоит квантификатор .+. Движок регулярных выражений берёт один символ за другим, до тех пор, пока у него это получается. - -В данном случае это означает "до конца строки": - -
    6. -
    7. Итак, текст закончился, движок регулярных выражений больше не может найти "любой символ", он закончил повторения для .+ и переходит к следующему символу шаблона. - -Следующий символ шаблона -- это кавычка. Её тоже необходимо найти, чтобы соответствие было полным. А тут -- беда, ведь поисковый текст завершился! - -Движок регулярных выражений понимает, что, наверное, взял многовато .+ и начинает отступать обратно. - -Иными словами, он сокращает текущее совпадение на один символ: - - - -Это называется "фаза возврата" или "фаза бэктрекинга" (backtracking -- англ.). - -Теперь .+ соответствует почти вся оставшаяся строка, за исключением одного символа, и движок регулярных выражений ещё раз пытается подобрать соответствие для остатка шаблона, начиная с оставшейся части строки. - -Если бы последним символом строки была кавычка '"', то на этом бы всё и закончилось. Но последний символ 'e', так что совпадения нет.
    8. -
    9. ...Поэтому движок уменьшает число повторений .+ ещё на один символ: - - - -Кавычка '"' не совпадает с 'n'. Опять неудача.
    10. -
    11. Движок продолжает отступать, он уменьшает количество повторений точки '.' до тех пор, пока остаток паттерна, то есть в данном случае кавычка '"', не совпадёт: - - -
    12. -
    13. Совпадение получено. Дальнейший поиск по оставшейся части строки is one новых совпадений не даст.
    14. -
    - -Возможно, это не совсем то, что мы ожидали. - -**В жадном режиме (по умолчанию) регэксп повторяет квантификатор настолько много раз, насколько это возможно, чтобы найти соответствие.** - -То есть, любой символ .+ повторился максимальное количество раз, что и привело к такой длинной строке. - -А мы, наверное, хотели, чтобы каждая строка в кавычках была независимым совпадением? Для этого можно переключить квантификатор `+` в "ленивый" режим, о котором будет речь далее. - -## Ленивый режим - -Ленивый режим работы квантификаторов -- противоположность жадному, он означает "повторять минимальное количество раз". - -Его можно включить, если поставить знак вопроса '?' после квантификатора, так что он станет таким: *? или +? или даже ?? для '?'. - -Чтобы не возникло путаницы -- важно понимать: обычно `?` сам является квантификатором (ноль или один). Но если он стоит *после другого квантификатора (или даже после себя)*, то обретает другой смысл -- в этом случае он меняет режим его работы на ленивый. - -Регэксп /".+?"/g работает, как задумано -- находит отдельно witch и broom: - -```js -//+ run -var reg = /".+?"/g; - -var str = 'a "witch" and her "broom" is one'; - -alert( str.match(reg) ); // witch, broom -``` - -Чтобы в точности понять, как поменялась работа квантификатора, разберём поиск по шагам. - -
      -
    1. Первый шаг -- тот же, кавычка '"' найдена на 3й позиции: - -
    2. - -
    3. Второй шаг -- тот же, находим произвольный символ '.': - -
    4. - -
    5. А вот дальше -- так как стоит ленивый режим работы `+`, то движок не повторет точку (произвольный символ) ещё раз, а останавливается на достигнутом и пытается проверить, есть ли соответствие остальной части шаблона, то есть '"': - - -Если бы остальная часть шаблона на данной позиции совпала, то совпадение было бы найдено. Но в данном случе -- нет, символ `'i'` не равен '"'. -
    6. -
    7. Движок регулярных выражений увиличивает количество повторений точки на одно и пытается найти соответствие остатку шаблона ещё раз: - - -Опять неудача. Тогда поисковой движок увеличивает количество повторений ещё и ещё... -
    8. -
    9. Только на 5м шаге поисковой движок наконец находит соответствие для остатка паттерна: - - -
    10. -
    11. Так как поиск происходит с флагом `g`, то он продолжается с конца текущего совпадения, давая ещё один результат: - - -
    12. -
    - -В примере выше продемонстрирована работа ленивого режима для +?. Квантификаторы +? и ?? ведут себя аналогично -- "ленивый" движок увеличивает количество повторений только в том случае, если для остальной части шаблона на данной позиции нет соответствия. - -**Ленивость распространяется только на тот квантификатор, после которого стоит `?`.** - -Прочие квантификаторы остаются жадными. - -Например: - -```js -//+ run -alert( "123 456".match(/\d+ \d+?/g) ); // 123 4 -``` - -
      -
    1. Подшаблон \d+ пытается найти столько цифр, сколько возможно (работает жадно), так что он находит 123 и останавливается, поскольку символ пробела ' ' не подходит под \d.
    2. -
    3. Далее в шаблоне пробел, он совпадает.
    4. -
    5. Далее в шаблоне идёт \d+?. - -Квантификатор указан в ленивом режиме, поэтому он находит одну цифру 4 и пытается проверить, есть ли совпадение с остатком шаблона. - -Но после \d+? в шаблоне ничего нет. - -**Ленивый режим без необходимости лишний раз квантификатор не повторит.** - -Так как шаблон завершился, то искать дальше, в общем-то нечего. Получено совпадение 123 4.
    6. -
    7. Следующий поиск продолжится с `5`, но ничего не найдёт.
    8. -
    - -[smart header="Конечные автоматы и не только"] -Современные движки регулярных выражений могут иметь более хитрую реализацию внутренних алгоритмов, чтобы искать быстрее. - -Однако, чтобы понять, как работает регулярное выражение, и строить регулярные выражения самому, знание этих хитрых алгоритмов ни к чему. Они служат лишь внутренней оптимизации способа поиска, описанного выше. - -Кроме того, сложные регулярные выражения плохо поддаются всяким оптимизациям, так что поиск вполне может работать и в точности как здесь описано. -[/smart] - -## Альтернативный подход - -В данном конкретном случае, возможно искать строки в кавычках, оставаясь в жадном режиме, с использованием регулярного выражения "[^"]+": - -```js -//+ run -var reg = /"[^"]+"/g; - -var str = 'a "witch" and her "broom" is one'; - -alert( str.match(reg) ); // witch, broom -``` - -Регэксп "[^"]+" даст правильные результаты, поскольку ищет кавычку '"', за которой идут столько не-кавычек (исключающие квадратные скобки), сколько возможно. - -Так что вторая кавычка автоматически прекращает повторения [^"]+ и позволяет найти остаток шаблона ". - -**Эта логика ни в коей мере не заменяет ленивые квантификаторы!** - - -Она просто другая. И то и другое бывает полезно. - -Давайте посмотрим пример, когда нужен именно такой вариант, а ленивые квантификаторы не подойдут. - -Например, мы хотим найти в тексте ссылки вида `
    `, с любым содержанием `href`. - -Какое регулярное выражение для этого подойдёт? - -Первый вариант может выглядеть так: /<a href=".*" class="doc">/g. - -Проверим его: -```js -//+ run -var str = '......'; -var reg = //g; - -// Сработало! -alert( str.match(reg) ); // -``` - -А если в тексте несколько ссылок? - -```js -//+ run -var str = '...... ...'; -var reg = //g; - -// Упс! Сразу две ссылки! -alert( str.match(reg) ); // ... -``` - -На этот раз результат неверен. - -Жадный .* взял слишком много символов. - -Соответствие получилось таким: -``` - -... -``` - -Модифицируем шаблон -- добавим ленивость квантификатору .*?: - -```js -//+ run -var str = '...... ...'; -var reg = //g; - -// Сработало! -alert( str.match(reg) ); // , -``` - -Теперь всё верно, два результата: - -``` - -... -``` - -Почему теперь всё в порядке -- для внимательного читателя, после объяснений, данных выше в этой главе, должно быть полностью очевидно. - -Поэтому не будем останавливаться здесь на деталях, а попробуем ещё пример: - -```js -//+ run -var str = '......

    ...'; -var reg = //g; - -// Неправильное совпадение! -alert( str.match(reg) ); // ...

    -``` - -Совпадение -- не ссылка, а более длинный текст. - -Получилось следующее: -

      -
    1. Найдено совпадение <a href=".
    2. -
    3. Лениво ищем .*?, после каждого символа проверяя, есть ли совпадение остальной части шаблона. - -Подшаблон .*? будет брать символы до тех пор, пока не найдёт class="doc">. - -В данном случае этот поиск закончится уже за пределами ссылки, в теге `

      `, вообще не имеющем отношения к ``. -

    4. -
    5. Получившееся совпадение: - -``` - -...

      -``` -

    6. -
    - -Итак, ленивость нам не помогла. - -Необходимо как-то прекратить поиск .*, чтобы он не вышел за пределы кавычек. - -Для этого мы используем более точное указание, какие символы нам подходят, а какие нет. - -Правильный вариант: [^"]*. Этот шаблон будет брать все символы до ближайшей кавычки, как раз то, что требуется. - -Рабочий пример: - -```js -//+ run -var str1 = '......

    ...'; -var str2 = '...... ...'; -var reg = //g; - -// Работает! -alert( str1.match(reg) ); // null, совпадений нет, и это верно -alert( str2.match(reg) ); // , -``` - -## Итого - -Квантификаторы имеют два режима работы: -

    -
    Жадный
    -
    Режим по умолчанию -- движок регулярных выражений повторяет его по-максимуму. Когда повторять уже нельзя, например нет больше цифр для `\d+`, он продолжает поиск с оставшейся части текста. Если совпадение найти не удалось -- отступает обратно, уменьшая количество повторений.
    -
    Ленивый
    -
    При указании после квантификатора символа `?` он работает в ленивом режиме. То есть, он перед каждым повторением проверяет совпадение оставшейся части шаблона на текущей позиции.
    -
    - -Как мы видели в примере выше, ленивый режим -- не панацея от "слишком жадного" забора символов. Альтернатива -- более аккуратно настроенный "жадный", с исключением символов. Как мы увидим далее, можно исключать не только символы, но и целые подшаблоны. - - - - - diff --git a/10-regular-expressions-javascript/6-regexp-greedy-and-lazy/witch_greedy1.png b/10-regular-expressions-javascript/6-regexp-greedy-and-lazy/witch_greedy1.png deleted file mode 100644 index a4fc2c4f6cf270b34d36c0c43d0fe41bccdf5a94..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8828 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 Ip4q(rAL?&3qyPW_ diff --git a/10-regular-expressions-javascript/6-regexp-greedy-and-lazy/witch_greedy2.png b/10-regular-expressions-javascript/6-regexp-greedy-and-lazy/witch_greedy2.png deleted file mode 100644 index b7b84c1b692a3811de5663c276815d3c8bbd9856..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8542 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 diff --git a/10-regular-expressions-javascript/6-regexp-greedy-and-lazy/witch_greedy4@2x.png b/10-regular-expressions-javascript/6-regexp-greedy-and-lazy/witch_greedy4@2x.png deleted file mode 100644 index fe514d4d528b01811fb5cb59699f348fc8a15206..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20053 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 diff --git a/10-regular-expressions-javascript/6-regexp-greedy-and-lazy/witch_greedy5.png b/10-regular-expressions-javascript/6-regexp-greedy-and-lazy/witch_greedy5.png deleted file mode 100644 index 43b01a9af0fb0b7f3591ec8b5083807c2d8d21c0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10914 zcmcI~Wmg?bur`+9F2Oy)J-BOdcX#)VyX_DlxVr^5t|2%CcXxM(jRo7-OU^m(x_{u_ z`7krpU0qdE)ob-rQx&1C_yrY-5D5wj3ROm0LKO-My6ElQ6yg2b{X%*a@9hB%Q2inX zRW(k01O-K}FC!tU?gf38jp&CXd3#^(3tkNli$kX59^8VVuL-I{7#`j_9#+!o)wn}% z8Z3gbRSw1CHBj#AyZ`Xihijm1z)2gH3FXR2&Mgtg@Bu>%hGIzGvgPs4aN>`Cx_N?( zrSzf}nY5PHT=~w5#?A3DY5yPwG^GgKx8Dvjo6Gm2ofEzu#-?iY#0yF6a^4?dB!Uny zf|s$IAl;MC0uwh_??w@;rG0;Pp)M6Y(BJss;Zvx0+8fY$z_|?h;DUoFU zN+gGI|ERno__4nim6F5CutlZqQuCay^h8%0N$KBth18(4KL#n(vgvqJX#|f$RXfq8 zpMN9~&dlVsy=fGIdlC`xR+7PyPwynGw&~YM2MTY%j)jh&R!NV9* zq4Vbe3r)qH5t6-cf5-p%Ch~tg{C`D|v%)>S%;2VayhH~Kvan7hs8amZcONY>^1||9 zV06!PJ&u{E>RK%7@z)%Y87hpyfGj5;FWP}Owl^D{Td~NC+**Zn=s&zUOCk^Pjhuxe zBeY2W-=9^6=bI4j^LT-+)0bXTJFLQoNC}NH3LH2Wp5!`ZU1^@M3 z2}!U?A{aI5n{-xm{yWj9fScA0dw<4&9rlBDsWFpX7vI0)oxT5(udtm^P@|1=}TuuLBiMoG7v-t%k&#yvO`seLVRwa6P zJN}nWuo>iSjXXw_voK=71f|gs$FhT?WF(P6#NVwhkyneg>H03p*&y!TbTpqbT^leC^DuNRg&fQ-^^Xg>;b4|x;RA|i!^lu9vj5$yPjW#?34sr)r~hhKhKKo) zbPN?0g7wed4GKhzQ@vs_iu{lJSR^P(mBd&@`QJ!gut2NIzU;}>V*kS}LV^JIwBqSL zsF$3_->oNUE7qMr07Bx-WY|Y zz42fZqb5unsVcScWcK<8e{js@i`c>==l4Lg^=7_V?(;*ei(80Fcl%{FAFCoi>^gae z&yaQ;-|_LBYNK`eDmXgUY5ZDc2*Z0)VI;XZ6d8$G9dUP`HHK~M`f?3)-8MO;P3Ql4 z^D3gK~*G1Bmj(WwS zK*{YUIo|$|=0ap-rxr=Qz1xA5vx34|hf_ZlpbX9xa392GklRbjLH+3$ zr`~YNEelWU2Gh5Jl{Lh**8|0^7NeIbC&BlwfG4`znNV99?)THnzE0pNi%rz( z-8p-YJ~wcgYPr!iLGB%3eXDtgfT3C^q*j3m{0(v8D>X6}sKta{k;I2{;G~t3fndf{ z;ZR6zvx!=T_A$@sB|W#jDDJUdqb^7gOZa6q3$R7CF40nBZ{)=QE*USJ-&z%!>;gQdAUiWos+faq&=p=o| zirx1EY=)0J+riCCU)qN9UUPaKvArYCd)Qp&)|$U8%t={#>JP-z8@@IT_LBI!#um>h z78@wtGaj1DY)^nk1O)=w%|1D~W@gg#hQo2nrQ}T+a;Fvvc|9yJtea1pnTGJ&ni+&`;UZ8s$-r#g^azZ+skHDy-p_gl)%Dv|VP(XWq!a=5X zf}0S@2VnKFxk_`1mpdP%=L2odu&wt&b8u?Rc{#H{i`hV)MH!iQ4#)4anMtpa$Ng+= z!$cIwWfmCzeg^G~4bo)!-QeA`O8u6G%4ALRfJ+8ZaRhiw8~UkwNg#D{$6`>A{>Px3 zuFb5cib}*f&Sp-NqPRwu$2-4Gq*9Ga!pkyvZ16i<0psD^fk^pb#A5S@YI0dkHGQiaHlY)Vuny?rq-Pyl4`}^K%>=kD^bHthz zTa1zv0WR4SEA5Gd6UjO_tSYw5yP-mzTIFtcyeY=>c4DF*-Br`>msFzzd}x&uZ;o0y z0k@^6-$Fr$_khR;bth-2qP?4Rfq_2OdsfSnFh`#h-#>H5A1j37Ax#q$*u#R1^ZaP}6T@SbxvW;~ZoadP9LU(?ZjcnXyOWU*Fpf?~#@x^=x;o{q>uH)?R_B3?V%r}C(3A+UnoL(EQ1!I0Fpj&BXrZ3b%4uMv?w zC zWHto%SJt-55q=@|_@Xt^KRBo?Niigpu*2K>)vY}=y@1LQ#I;R0d^XPOm=guYz zkb(Nd7%WJVmpAR)CXiMpBMVyi39KohF^BDZZyYP`0_YT)t}}oWiE(M-PoCJ)?%P*| zr~YE3@-eSIRIN4WvmRPhY&f*anADy+sMek^8IS*kFgiu8LEKW7JjQcYyl?Dzxy)M( zplqrV$v?0V13Nm9O~AjBTvDe05!3;{EZH49mH|{p#32v=RFq^4>BR3~c9i1E`pp!A zJS)!fwKM%a`_)~Vgo-}$%rv$k^UN2US?4x9PGo3nuW2^A+%AR|=KK3EGH!MN%(OZd~;@0t+W z0D#ff(9HVoFk|uD?V}Z1%+Zvm9bZY6MdonqqHfozpVOJ6izBHcjNg0q znD8?qq!d5vrF&t9S!CP=!9L-nA~4{JRr07uZg1p2U161yN4!>yOJx6*fdU#KJtU?|i=NK-USG8Z z9FJOa1)y2Pdy5)u)U&*5r!+q8?dC31%WR9Hz_$Sy`nEOJ&EJ36+ZTN@GUgdvQ7EY< z^G*~EjKKatPb@L?{rQJh562O#y)QmS&e=v_;9171mKUylBs3x98Yi92L2q+f+Ccla zszynhr&?5cGL{q4sHyXCv>alj9#fS7qm5hd&5~|d1N;)v%w^2?NuI}VgJ6}=cd5wS z{e4STA2{I}e7g>5M*F+K`(rR8e0)Yc_R%MkrB%en1V2#0soo=r^{?}XKT=k9wz0C; z+LlbDusQ@=0KQIJS&|3LW6k|~<~0=b zQzy3H0Muzxpz%>{RW+cOsFXS zLsIa6kyM_n%YV2_2~L{sAuRe|c@n?L{*s~eeg9=QLYU-5yVzV@ArT@!D{!bMnG^vId+3z~Mo(Wr2H9Zst;e*^Du-R@t3FAhW3!Lka zqy+=b=J4`tD}(D9{GO4$H72_qT3<^gsF$Ke}~{k)`F zW-VYcW#Ou?DJZP;Tmu}Xs{Q+M4YJQ4cZE8AXqUY;li>LBGhWJ%l26lzl-aY5FL2oC zgCbEg%1(*4=PSuqlaB>%bHs{BPE31tPyI%4NfnU z5qG1j%H_GiRaMFyMv$H*S{dnK*>$`G2o*q`G;fHKE8>ZZ-LKKWqeSTbMf!P&*?r&w z<^Z~xH-h0-5Y*WC=rm`pBcvB=r9 zI%4C**F%Qzs(Y~nFJI6T2U4%D!0Y&!gJlmcRjSNQjq``dbFWhpI8PM%BZJLBY`G+% zI#xYySakAbS&@%qXo(x17yXvJoguKAF%FYceDb&ZyZ7Wx3dC6%2hNqY{BTj=w1t_9Nh3aYq3IcV|0)^^T+~`w!SXzM=!`G{1jw+MAzMXWjJ>Fbq&_SQCnS5 z7QKTg+ep7yW7~ug{wl%H!SKh7@G%#7eX+7_SIT|_LBmB%dNBFkaUWU#5j`7T2EW}t zsm)P3cWK0{p(#38qpp>V)#>|T$M6oVY$19_+2FEi9Q|A@nI)bXdTW9w>gM$tkcvz) zN6@XqVQQ}2;U|Wi`L{jYMxicv%9htP@%1=QTYdfAz2V6mGQ2vRh>b~0OC`oc9eQL! zfiQn9gLKx=rmi-t=Qhp$Ct~es*1F6L&C}g3SfPVNe*_%r>jJ zKe^9)=|B|--LY-rwC;)dQwq!T;=~uui=hu+f4j&U<~cADa@83?5(A@`%x& zAOCed3(Bv&9{*}`_-(p5SuD2+cGR_J{d^urPAWhOL$9$EK)iQ-)2Py*)@xr0GeF`6s2YUb4qqW1c#%7 zcBY8QlxaJAIbks}I&+5(y%s|hi*87sAkOn4O(zeCs@k;!vOX&uYN~y7x@DicnApni zb$a)hy=H6I`SaRI_3hWq&{5uK#llMxrltztQ)4anrx%a?+t`FaT@tbm2tb+e6PKWA zsQ(Vxf^iSW^zZCi8T6ESXDG34RZt8LCk8myQ~x!WORY{*N&C)1HFH$sKzV-YkF6n> z?*);bYSvl}tO64OU0$0fl^AJY&A}9=;r6=!P3ieu|MV6bcla3ZYm969QV?@?xIM3n zWufo#9Svb_`@vpxF0X0L@+Xqf$QUIfFQBJsvH;-Et+QI62oTgNzjpr7k?SH%CF0AB zywxydi;R~40_r>>){h4bXWy04#85X%Id;oWM1l}NPNB#6pVk6BZ zP!OGF)Nk)nd`#43V@aRm(aXY_k%1{5J&M+5(A{bFJt{YXl$7HB92Gw$Dg&PWb#H+} z3GZ3#c?H=yj{dI>0e5v56l^Mp1Tseqev3YBXWFyU0xPAjNd*Gcp8E|c-9m#9EioS@ zd|`fQ%V~dNm3Mv35w>HPOSZ=nKh;2eL(PXTC^BiC9*?!g+Up)EQOH&IuJXsl!o00p zi~+Z!uS=FeEl0;Oo|Ku3YJ2%grJ>&|*S@mOc;gY)ckTX>|8jH6x>+9DdFm|C$j)Up zgy%~Z##_R`pLE$rd()-yt0kZpll~?eBs|ZPJhau5HV`n%D?)M_C8TiV#Oq@mUKg^* zNLbidLBj8}CQU3t``o0O!v&255NftU zxko7>5VmolpH~vDSjT9>5YC>~D1ro4v>ge)`Z64LoaXHbPak=ZVyo`j`et)@&LJGs zls-$DN$nzW^bEl+7;l)^FxS)5IJLU#3vtxEn_pQ(dlLF-W4b-!tfto&@sU!EO)+8D zwZu!5lul24<)!;)i|cX;R;2*JuJJ6`+L3qW!TO&LypZJS(ikH^cHLPvEK=YifZW5J zxkB}z+Cv4yF=F-^FGYLqqb3{b1;^nZeg=DjHNAfIF{awGv+Geg^`())> ze-9wsZoYg-rF<*W=aD@5T>ex#i(5dH2t|8^IlK0N1;IOwCd$Gl?%5l!cml$(24{+k z?~zPm=;c?lwR4&8i+ZvKr)s;U`Q4TV?IK;HrvY{!#jQO|E~8Uxp>vt$zCS{uMNexz zf3?tlYS8tCwyeVRMbc1asNbug`cnTRI1EVr9u)lgda%dC{yjzXGM3pc zbQ5p)K5;rl0kJkvvQMHhsk!jv%ej)7`yCX- zu^t<1c071qiiS2C8&MG%Ezw;yv=fGi&)W>kg?Ax7C&(V6S7Zy{D$ZqUSt$jL^G|R& zi+N-;SSFYKoTm2Z`jvk<8>>NP&>+MioIPVC(6Ue!Czf~4-IY&XRB6Oj79PlY^HOg= z^ou`9Itk+cD~SwbsjYzzaF8Rs?E@jcnx1}_6BZuP{bU_z4TtxE;L6ak^a0usOs1~f z*sD+1nd(QWqA8mV?{09jxm0(<<|yax)I+Pu5^Jh4+Qwf@M7=v>Ka>&A_wvrdB#S-d zD9`&;kX8_F8ky}Y$wu2eMOmBlg13CeD%5?CQ9}(EZSawAl3^F?I4;_`QE0p?_4lMH z@X)B?Q+9i38rxYsz{?LmR$EEu)C)f{tA1OeQK$ZOqnmXlL^EyK&FiTrxxHC*#lA&; zJ3u;jR?d@p=R4(jK=e%Jybz~Tr~qL)Y_bG$GF%TagyMzma8?L_etze>xqcZc9P4LK z+d1Y9d2#8$NoqAV*P%7vG>^C!&=(-C9O&<_Z`zc_=d~IpdE&RBLqAj`{tc*Mw&;$x zRfdS^P#kGLJPZ|v-6C=8``Fal|CsVl|FB2Y|IPkNgvsseYYKl4H%Q2p87`?0$i9|{ zWu_$R9*R7hK9OTsO8bMZ9SCk=6JF-iw}E7;y*lGr1Tdiz!lT;gDtz%hSNhyj;rVRk znl+?U85y<|p~EgA4a&D|3>Uh=%MiYsMYm@27*iY#Vc+RTBQ_k9E(6b@pjt7e^BIs$ z^!e+(9LH0|V=^REn|x{A(z+yQ8g$=|zO#x!6ZE8n*>SHz_IiVg!t&KK70|?MGYa^rYcoI8o%SFn1EE|Sroz-BD?H1kzF5!|)#54|vK1$)Xd^d~ zogmhe68lpywXO#n&!Jf^!X{pU&9w7!Y@-J+^wCSlMR?{M*p^}@#9t;+fY8Q!y%U?H zSx@stP}&83R%7-Mz4gaCk{xh`*%HAca?I~Rlq6~tZU%aXdW_$39=~lmw&NCb@5%&to284{v_P?#3{@ztnuvB!HNBgv40IOSq?E>Y6c!NgFU6%^i*4vxX)UpSHtYqPc zO9uO0Z^Imh>autj-u>|d3~$c?zfLw-bJylkD<6wm-$}mTn{*dnXp5qN>Xh>CdC-Dz5vbR11K@BuXBf4d3u?X)c#`PnZ} zn#uaxA5R02fybrU={?KA9L!T15=}qVl@k_q&D7Kt%97dP)c{y(7?GiXOd=&ma)Wu& zo%B>on8opKlPqV_*qGOIMtal7BJeBH$J6#YQgfjv3Mcu zAYIh432ih5NB9Kr|O_&Uvt` zs%V>e?@z<9w)XXtgWl?%mfNkw*TtM}viIJvC=mXsAbqHT4jt38rA_#D#ptQR5m9B`Z6~wMvH`3` z?V)&n7*JjXWBTFrL3a5;DzqYx-Yu(53GNZ|18%2?0m;c(oGI~$!#B5gD>)M4y?b`V zO+#gVyxoLf;{B!`@$*6K5h1+9g?1#}zaaPy*?j`26-az{JPS{UhN(?ixhF!aM8k`% zzdu6pGc!=TAD!VGHjTK3+EE(v#Le7 zoMdvgO}V@@N`gvkNr%VJG3r!n9ymEIr84B=;fI^dS(sKXjx*|Xx!x(^xlA+7r{L0K zWcGU)!R~VcvOnNL&2#Er1H{dv8zoK29Of`=Fd2^qd;AdqM?5|L?^BEN2_=X?9~eF1 zQokn=1;r$HeL6|u&*I>_eqN|Po*;P!)n`_Fh@$4c)FPakmimzQZn0mZGn6C#x;WZOT=!Wzk!Pc4_X(NbQ+7s!iAQ z;t!{>u*8jA$=Vue38dYCzGR$aNB|R}{yZ zdh|>>(dd|PvdFvA%2>E!lo@C~NQPJVYC*-FRo_m8lVx3c8%Fe1a>rYz`xx|;EJoES z`G|_VA?{KRj`W2a{&Q$#)vzH)%KciN=okiW`eQnxxv?nwK{EK{`fJwAuV~2o!Pa3& z-*>-4%O+&*Q{uh5c|vkjvO?{SyNIZHA9x1MbicV91hO3mM$??-t_ls7wqpB?wV5vs z!v}5Mw4EV3bJNvDUtPS0Yh?9l0u9aF%Z;xdbvp*tBYs};@A7yS&oQQZ)4wBj#P}kd z+j7158^lNda$}G_Mf0m+&JK6w&m3$u-6j2kjrN6mCr{`xp^Yn=dArCPgv`9`+;zKyaSyS1}q=JwlcEEx3WY z+kqxd*Cd@J@2bVo@)H@+(O$7W$}{pDJ(r44Bs-B3u{5IElU=CMwr(+?gQjzxE79Gh zw>94jYL}2{p&5yGSw$I9=p^tt`e?hX>!r~MP;Wj7#j-q9*w46EXejpKF%#KVXx|-B zn}-|4c@Y^-DBsG0!#|WI-}}d_m=j&kEia4$1FQqA&!71nKwP|MQrJ-mwAqHpg}GBhIthC@hi8`TXxC?ZtPPZVGy z<-$DTETHvWu4nBxkUkYUoW;gOKbRFS%H7$cr{IjjiKjIgoyN`D=a)Rt~{F#H?c77lbm|R*wprn@EBbi-xX^vhWR^O$dC>huErD69LA1 zA*EFK#3gldX$86-VX4RgTWavJgUH}{yP!Jz!mvrU>xU0t+?1Le`Nc_p93Z_N{e~L9 z_CCvBm!h?pe{`@J6u-hET@Np1KnEzE!yKVF|ClZhR-?(0_Z|O{!^$B)IRpw=6BFq? z5<2@DJfN0f#CTCrN*A`^C`ol>P_UbUTNrfjI`oDM_3F7Kc>k5s*{o+_A^%XlrW zc~^0ve9OO8&npNY6C@kjf72UNZP9YMedj}^mYrJo^Eo0!u;(ah;cB=Q8CB)ni%2c{ zY{hf@i0$#(nF%{5$(Lc<7Z({-3E)H&>1Y3~YB(T*iYeQVULA1-zskV(j-&+0!l2F+ z`+J$|z*5PmE~om+8=s$S;-;a+bMs)Zq= zEGlM3))ZxP;cGix0d}hZQ;z3CVcl5B3JlM2;|+fTv+Hfk_IwJt^6_X98Sv)Rz47<` zH8cAy5pq^9N+q9jlPrV$$(hNCO_$TBIgUuZPcg*1M@0@u2ASUnw_IeGgHY@e z9mT`rM@aLGPLtD3bfdkL#!DSOKUkH|;yw_-=jANtI*|lCFMJ><(r+A@8;4r?nwyK= zf37~@&?qs%hx|W4(*x}Q diff --git a/10-regular-expressions-javascript/6-regexp-greedy-and-lazy/witch_greedy5@2x.png b/10-regular-expressions-javascript/6-regexp-greedy-and-lazy/witch_greedy5@2x.png deleted file mode 100644 index 353f69e25dbd989432aac1abc38c3eff3a705f9d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19924 zcmeFZbx>Ph7%fUmp%jW0cXuo9?iQ>-@#608h2j)<2yVrTOOO_KcXtc!1iR^dZ|?iG zbKl=@-prjjlbp$%b3WPYTYG1HI|)|?NFyWSBf`MIAj`@~sKUU&%0SP%5a6M&O&+Xz z(6?94s?uUGm7|0QFfbx8vJ#@7JYF4VzVpG9Tzo0>He*YO)D5C|hk)Spjy{j!84KqW z)JCzp3DLzQ0<4>#lVM75IC4U{n7NT8`m!0p6}S2|F>66^O>Fl%`* z;54LO5nORD-0L5%63#Yh0efVX+N*2MsLkk&pc9h9y#DWT9P+E$5$8F|!3R~WfW_MC zP~%Fw?pX#T>%%WYJBKnEMi~f$@by0jkW|@mt+2{jfP2)H4&lQ_f7S5k55Ucu7_Lgl za~5*gQu{5k#yjew3m#V^Z)JiQw|ES-BxMgu{j!hCZE3W^wb`lz zF*&c4-~V;@Z;Z40z-_g3QXYwD9~Qn~Q zKrAw)dOM}40KKCLFM5yZ{826z%KHKhY#!ME6$$htAeH7zVn9Lv5AWKy;f!VOd?`%# zrq}M_EeqnE_%eNc1|d5VJ$eC1|B3$<+8Oow5B^#HI4O22wPVH-{Nk5EpObm6N;v zs25$zBgA-r4un^KIa@7Fs=MSPPuM6++Q}xmp6uITxU(p+vP-}qQ?0odNB&pb2>h?& zWOlmgm~nUq_wey5lw@!JdQzT(NMaD5{<=oEOJB28uAvsW zZRHnCFI*X^xFEv6TnyuQC7Po&5@&Gm&1vW`bJSGcPwPo9&+h;2a+p`L4$1Q5FDP7^ zVK6p7{vVY8C*}X=!~f4S5Qh9(*M^ef>Jy>J}LWBkH+Pb+5c9Dan7a7cNS=nzi4FsA@E=v;E;O;E6!5`xyKBYY^#w zZ-AbMi$Wo9l*sP%?yqtpg@O@R=9P#T+Fz)I3Fsz;fu&;|#B2VGN?)NtS?hfP3@I7H zU-b1=#0c$cKqBtWcin$D8|odrDoiZen}6J7MffEm_uWZ~S@drzfqDl^2P1><4@Je| zzWG8*CB;kecM-xsnFh-EFqCgz{f&Q__s}$a$Op#B{}UGs)Gi{-hrs{NE6{UFcxW2J zRYv=%{)r0)Y8MXXo#;OU^x+#c4c)Zn|C{vh!gSVwNw*NHmt#}r)HB27<>XQOmz%IW zJy%TTDyQ-$C*x5O(5FwD;Qw~{OzF!yGHe3;)#0Kfv1%;irgUvGaeQ-{U8;{``_ZB+ z?6mW!D|{rSU?%>CMIWV*C-~YkhTkWSeZLn1M$?5*)^fN3N2#p4||R; zVS2vC;z{_FoZ?t^!9hG!D&?A?OP(f5^^3@J|3EAN-66uQrzxXnQ$l5-OLOd*L!jk!bC8}1Do-X=~NW>gW6x`zx@tE8WZzeLH$3}pCwq+gM|nH|yE zz~Atm679+Mb8KBg3z<*z#t!oQO8!SxsgcO&T= zJ9egFGAQboDUg+*FsX{+%3wz2q4CJpYj@9w$FqGuj026Ikz@ab8A_g42~Lavk{@cg z;>>*UYP{Io=c|U~L9Ar&DXV74HlM;WB|gCwRu5w4vIXG(Wjc)Db!&moT(;0^;l~hd zwo*ilo;ke_ogyD*7^Hws^?utYk2>KYyGqdFsU!X$UTBE$5A+HaI^S`rusB{!Y9XiL8fuYVIlU}9}CmN3i zAD^>W5I}89 zK)Gkg@-ELonG$Hu2r&4{yNv~p5`fOrdIJ~!1c!~E`wwWoQ=-{#odjl+czKjFwi?Z*B>Bm9T@{GbcKh_xEY(SL#nq=ed)`GSD*kDDD(3hJ?6AUFRf zF3~@BDL=k>`!|n-89=FTv(YAw{hzo

    `2J;0FGa^=_6|&W~nHTuu!?o%g0!lL6vX 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 E00BPoRsaA1 diff --git a/10-regular-expressions-javascript/6-regexp-greedy-and-lazy/witch_greedy6.png b/10-regular-expressions-javascript/6-regexp-greedy-and-lazy/witch_greedy6.png deleted file mode 100644 index 2ae63d20b0ba6e02bd31246deb1f9f3acf8a4f4a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10410 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 JmGGCq{{vB#WXu2n diff --git a/10-regular-expressions-javascript/6-regexp-greedy-and-lazy/witch_lazy3.png b/10-regular-expressions-javascript/6-regexp-greedy-and-lazy/witch_lazy3.png deleted file mode 100644 index af0482bbdf370a7212a33f8b112b9122ef0abc40..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8670 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 I7dP_%Kev*5_5c6? diff --git a/10-regular-expressions-javascript/6-regexp-greedy-and-lazy/witch_lazy3@2x.png b/10-regular-expressions-javascript/6-regexp-greedy-and-lazy/witch_lazy3@2x.png deleted file mode 100644 index 7d5fd2c6409cadd432d37fca7bb7111f7f6495c6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15188 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 diff --git a/10-regular-expressions-javascript/6-regexp-greedy-and-lazy/witch_lazy4.png b/10-regular-expressions-javascript/6-regexp-greedy-and-lazy/witch_lazy4.png deleted file mode 100644 index 920530bd0d2dab8bcc6942529ee29fe41326be67..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8799 zcmd6MWmjEI&?OcuNFc$Ti@ODa6XYVnB^M{SyW1tWySuvucXznB1$PMUZo`wj^8;qB zS+nMRIOp{0?y6l?yShK@V0l?_RAhW)C@3gYNeNL!C@ARsxBnlA@Ne(7pO!>#A830; zabc*6F~WT)C~`bW(XYxb(8uXW9v@X+I@hGBWTrUzv)(QGC`Tzl<4lO*$YXaI=8Gw) zX{qx47F;Kn7o|~;vs3oo^g&>n>*(yL_~V0v?Qb`o;{#(S@-7=&y;E_@w_Y+f`M!gT zof$MuFBx0==$(G9u7Tc!g(ii9`w2zWS?hp2 zpGn{vWS9&MW6jM-PL+z~XF1^29>s29-CmWyhq{dbBLs!`)PP~~S!$?#9WH}Q&#^`B zlR|x;!El6HqWj`1(TO+I2PhaJQWm6Isr>CQ^>zOda^Gq(VndxaS4ZPDRBDtl@H!qM z6!e?VC%Mi&sr~+11hH3R0c3pv;mYbeq5~W)9xKhbe@=@j!hz!|)aYNqIA6 zMus58K*PMjgoA_TB+Y{&``=i8z+}Z`;X^_H2T!Q;162Me7BOg_e`6>b$|BhR35^9# zi1wYd!cWqFV<;)4gTMKHvxovMF9ogii4^g_Izu7;RP^C_Gxpysv`FWkVBm|Ebfvgz z1VM;kHtEyLRPaI)+@*dY*!oQ3hv;hSV@6Jm+DqQ$_S3+3Qut!guY>m#$Cu2+lCrpE zs8f7W2E!d{Rd3k+oj zZAWApTZWV*Uuqd&g^`Dnrcl1?r5ktQ9(OUDE>7Wr^@07D78mI^ZU-CgBnL?ti&MPM zA*H43(o<0-HioPqo~h?hgcd=PT)J{-6kbPmtujan|J#+7|KaRD19Q_KGum+E>{RWO zg2Z;l5$lFIQr+deigGsjYIh=12t#~<9qd3!mBo>v*AU!34D??vCnCZ<$cex;duY?a z2f_bG&k1tGJCFMcF?ndRe?9ruD?+sQ?|3PY|H~>AOvPL6?8M$3{o}^}>FnJLKP5;Dtl3;CM^Oy&^!^ZC9}IP4yF z`m=Xl$wkmTtB_9JZRB)1S{?%R1zbHfHOdf~tKq;f5Ax>`)(p5Wu$ky4vvxmv*DJs6lSox#Z`&%ABP z7(O03(>A>d$G%G|Qsbnbl#mkjrMo!anR6X6dI5NT-!#J%zn*)vo(*68cGPB+;PK1B z=HY;-iK5%`ePG9V;ky>?EA?$F(YR`QdbGV;Heo(YrRWezF=74ODJE@1pt>jXx0Q-#Tg~GNxWc)~e~Fm}?U{)iMdLR^g-)q7sw{0%2JVyUgt5 zKBolej}&Q`H%@t|s7aG$>;@_nQ*v_1%5A-mJCi9#FOT=--I-K&I?2-|2|xh?%I!f| zY(x`|wa$U=1kfEa0MFUrY9byD@qRLVhb=Ls^Sec2WZecBJz9^53>xY`sX`~n zw^13~%H{Bj&`%Og?W@0y5P9~2g{&fsQBJ-sHj7NzoyjmMVTgP@!W;6Upd7Xx7ZB3$>z zZgm-RB92@g%m>o;xpki<`3|pSsiQ-BQz)umb=k#kQPw7Rrsxwh;M#Qf_0lPhvgEW0;SBvC3-g;y81-UP4~ zGe@2GX&kKhd};)qjP#>zD0)yKbY*NFl*bd@`uYbmfwD$ct=E3d#L1&0S5C#$RXPwc zK3m`9kF~8Qq=Ri`wVs3``VXau;Yvm_U#H8;gjk^2gcf>|v*^{zy4|Pzxd6>V-FVzy z{F8J2LA@hmm5T`CW$?rGT}w1h#I7@A6S(c$hX_ix8N1x^tf(Fg&(|Gc&Td{tPRY&MY(1hve?DZS{U86 zpnbWOC70W|t2vvEUc0`wF3i;1`|Uq;uDSUET$lUm<4n}IJrhs({ImF!CJ_@VDlaUG3!BGxxjkqh-t zZY|S!VptRFh&0Y63)tGzyv$<4hhUXPl>8To@{_qkk7qkZr_Ew@TEPcLtIe763A%gE9%@^s0cCR&1zJ5>= zI7T0OT$Q=E($~D}N3WV<$>zpbDkpd~K;`74hg|}2Ja>h-p$P>^t1ISY^}i6e)EzNv z8SPr6HD7PtF)a`<#r(Q45?UJe@6lOEH?tPseq5jC5Aw7Aji}mRSSvcQZEL|7^Mci)js~)fJiN;LV)`spND>cq#4Sl3*GJ-K5i4v1v2+RlQC|#G^ zZIrI%ho`xvr!&Qj$aaIpDVbyl!fE$TN9xy%PffN)b6Z**WS(w>UqEB74|jRiHT(;z~|?=mQ|bWZRKto#VJv^$_jKu*x9BMj@A&T z&+I6XVMmbGt)}Sax)JL}y-6|aF&B&TdRnK|{G|m+eU#(q53DpPneLkNkMkuyt*>7m zFedCjzT;C|Jvf(WD!%r%`}6e+uH#D6@C7xIVNDjd(nwEI#+o`WKx09D;t~nK!?aX= zYJjM{T91xHp!j_5SDWrt*8r%w^B?kBDD82ap3LAwGEw)64;9Eq(mm^>F6W3w7c20{ zv+h_i02SyzIFnoqMQ7Su?tBm4tyr`?_6>rQF%<7^)Hm_8LD2vS>Rra)46m&!E$s~L z`b3q2A**e)xAX!ML>An(UlJ>RECgCs)>$MsI+*7?L;36$hH4MqsRd2USBMyK7%#dq zP9J+P<|o&mofez*)V;eg9lYhM(6AU--_SrFswt}q-!(Z<7|7Pgmzmh#q#L2BZV)~K zkyJg=WVDPL3Ug@cSANr8i~4cOb-ZdT`k}ZRQfE(U{wq`=pr>qjY{8AU32}eI?w+-P z_Yt;9sUfnIB6X1tNP`uH%$h^9Bhq&`KZ(LEC1`1K~z_+lZLMnyL7Q9Gi68t zqMxyQeblzBfua!=a@wR(>6Y>U#6@n{$InG?L|J1Hs&}YJp+bcWNn-Tf1`D=nLj7%w zQ@Tt2fU)#ApZT5;Ovj2B&Hf;vYChxApDfZeOw$K|w%(4^&JQz)T;b$NC3YW6%@Bhl z6PI*K_T8r~#K<&8FLANpJhd)OuGG30Z zU05q!T0r*AYI6o1>lQqjG1I5S=&tVD*!V(t%VlnckK@4>MD)a_hal?Jtl`g6BNiBr z53PD4_ZCw>nU#yEy>5nCuKsNDqlE--`GEV_=YwGT=rrjsDJGG`Yl`}jF3-0uCSSp- zV!(jtm|TR{w=>T*2{v$>98j$iY~hzChn8PC8K)mzM$}kt!F?q=moY*X(wY|m(g$x> z6)E24?XRJ?RwVzr^xF*6mUX)e7!zHJ`Pp5&$Vf>w@}o&k*EW;<#pKDu2L1T=v!A~~ z$|v{+k#CrIvL>792zaSPpD=@Y;8czu^fk}UR`M#N!&;6^?)tSI$+9(ORj_i;ke;XT zmq`ZG1^3erI4`kf`_i4W*=)#GxmWo6N3in4;8zb&7sa+XpFQ`4KL~;Co(u9gxG|Ih`0EPrUS7 zB4OnV2}kkVvh%-({(eBB+-QZA*p~x66)Y-AdyVfj5P-m}Y-N60tK5JXsaH2e^W7h^ z)^O_k(ayY{;{8sqeTPX>FSnPM0_@ za&Af0Sy=ta5i+htMx^W(l{q7#yN8f{SdM|3vFWq1dDU{$k-Pk*{K-K~O-UacN-}T+ znCO<~WM+={(fY<1(l($WM=ih;vtlmj=~XF#(%#Bfr5O3{ixQo5Hx7>Yp`^aPf`tSs zF}LwIqNmNU83c|(^jP~}Xs+ad*>#A6B$=ta%1aol2iI^oLtCvzx=F3hF6Bm>J{*U> z$%hk^jwqfUP%LpfZb*DzWqb;?m|y?aK>%~(SlR0mPf3&!+V-Ovl}D~a<7V31vL>PK zCq)cCJgz*oYog<}j##{Lw}$e>O=-LiGR$#VNDh-QUtp;d*K*;*B;Se-Z{A9;%wsU3 zL%$4<&663>L#xuL2v6U1iqMkq(&4OFjuflN_2dq<5zelR`Rj3HJMM=>)Zh@ zc)pz}YVYm1#V>4g(N5uSPs|kV8XCh#Gd`@a2LILGPFo%_X;iU8& zKgAx6F@BZ~uT2t$y*p~AI0h6GMZr;n6S15JfUeht0??{G@yWgEwV}zSPHI>%Re)1@ zUBIlu#Zhp!Cu(w&K<0-qW4cs|{Pbq=Z3Z2FO+p}=2bm`yF`q*N3E%IjPiJ)4k)W#T zi=lOom$E?XC>Al`u?YjI$kJ4ev6$!Y6w!Q5x=0zVsz+J;0c0`O81UAmmw$QhjS@xQ z^Gw?~mQ&KN7r1agc$d%jZO*2p+%~}kz++EGteHi9G}DcU^T)JUSGB+j!T|t#8O6Cx zO*1gr{|5?Q;PEbfebja2H;b3S^y4fMK!oZRC0zJM%1qTJSK!19*3xMnQ7IukK!D>s zT?9qj-BDT$Y*tym$fmo012^pXk{4%9d&&l|PH$^QUP^O{997LUtc;RSSJF$SvzJaZ z-Ckud1N16uhMM8!L=7rNltl$y(#PT)*~J$|$(YX#ce!%tLzqg1$(^jXKnR*Jv9K;@ znH=p05z1uIL1ub9Qocl{c2Ome4>nEkpag!&Wp}af?Yc@5y#W~Lf-OaYO#sxP)*2b> z`}UjHLN`!k7IJVSK71rt?Z!V6E)#dT$q8|7A&SzlBub(Ll%Zyz<@O!kyUtI6T_sZ>6A0><~(}hoGIMzGFfB{FA{#$~|U^~-?0g!RUvTE71HQ6oIC&I{h zHB_+at{~~Ji=?LVQb!p{jn26Hty;>8n@2d)#m%-u)r}&gz#sDEPP>f$ zabas~6tL2I8OK`OK6DfpX*^+7pJeVYuXK71f!Dwb=shBHlunz2&11@0Vzt}g+H zZvd$*y`(;o`5exz$A5jBxtueUpr5fCNV3TnS|TX(KBZ{o^DZrdT$pNjf1KG_hM#X8 z3GrZ8Vmis_p^EF4x<}D>opQyh{$+Nt;TT~p7_|wP>oKH{glSrP!K|sg7}k~?{e*jM zgn{eY9=M-8?XAwvJf}>efb>AeFA)__QY87Mo=peb$8~(I*~H5BN;3Rf0+}C0)iJ8R z*c1n#%$b#wI?S#?OaxuWW$^XElzhw9@jS7RQ8f57Bl#* znEFR_9mi$g#c>#e2x}BGBo$qAt=cSsf9gWz>ZcF#lBv13F*Q?YxY0w5G&zGqvXQ29 zYq-|y!<@y39(js4@2LX6{z+qijRd|rIwPwKQIfkB4MzS6MG?jR8r`>xf9H&CISBT< zT^ZH05p^?#dF|61?M6671q(K2hCY}++crK$DfSc+U*cl#-ddr z1V~?z)R?+m+mjEhV@>xG0x^AY7Yp0qn)1>IYnGT zB}v3cLE3lhB}fjr6F?B5M^=`W~Ll_`)_n=q!o5Ad3~ zFW~!Q=|n18MPId#sd9BsAO=M|Ni2{m9hFsz|4@q}51n;?->6n{Zvyey>Y+5C4GVIw z=&fDXOfc=b$P1h}R-F`#tEODpvaqr1ki2m|D}xs)vxE#M1eUhXs%SLZXf)6}6Be(e zS%Qb!x6jp|^U8Ht0q~V{wgy^_W|mUKL}dPUn^k9L>&$qZMb(h*+DewV=A`D?F(Lck zEGrME6e;t5KAZFr7Gc`)_qwf&L};@HFP7^$(_BD|mZfeNQ_0TVlO3pA||W6Qv9;`o(xMt`2c3^tSWL6y=Agl=E>c4j-1} z)1VI{ZXFZX(}TlbwPy!qqg+ng^$tbKY~(iuN!GM>*(dtmruw4sHZMN7Rd0!+#6-|8K+EMo4i-~}Cni)wL=|R2Td^_n_!8D7uEVG4Uwu>TqISKI@BZ;1)|$u3Aleb% z7&wM(YTN&W@RT1Fw4Qt`piN;NV?H6aqm^L0V#UBKuo)fS`y>bB|krm+^F@Vwi)Wh5o~sm_K*gSF(j zDuZ1*oI4v|7AwWYmspX3+pLp}3Wy1>qsl=Y^6}HQccMw_6%R>f3hDrIa1w?s1o?if z?N!g9B~n7dE~b*o-mm8?0*JMGu!Qy8oqdG(0fF0&X0zcJXnm_RWqQD=5qX=J7sx?3 z!e^IqSBkEMMm*Tcl|5nm5*X>bR)32eAKLm^)9vYcaBAz4TvB_+L&kXXyN%Mc9D^Hk zQnSJ<8t4#-n8;1gbz9*4NRxlzin-64jRfK`he5LnD4J;)is~sg@8w>Y-p)Y^Cm2 zk2?(CQ=Z=r{oXYAwZ}a*H1(Lqvv3f4*so=t#vW~h8i zoMpl&oqAX9ja619Q(5*BA+)f;ytc6iL?;9APgix0^nKHSlj4s$Uz7{3$_3;9U?0g6 z@QX`^YF*BSBIypB6S`;zSS432<(5aU5vR8YButh77D?<^aUVHG*~e06K;UH7XXq!U zGLD}c%DykP(1wN*1Wju?x*)I0r!cti-Zjv^YU32%V&)7cAa_m31xYReJ@WLJlh?Tn ze0m^xh*YmM3`5e*%x6Yb$h?-5M*8ssadv41x1r7c?*>5$jr7KpFnrWIvB|5?#%Bb2 z4r(H3J-><0!7_C(P4|$Vt?hvR>``&6-5kJ-U~&j~9={GS!kHi~2Dw#y8E>tZ+KMBo zL2X7fuadTYH$5V!jq)mHsF+vj%-zI*1E@VHv*z(zdNaW+-@zxNM0{Myfx2Lxt#Aak71l4J%~I$g_iog3K}e$^Ax%5eYYyZ#d_H?=8W8;jngpt{!b(6 zmSy{0y74?URsdsY#xgnOgOk&cSR7+bZt9}0=1x`1IgXZz)QO*IRNYE7smwqk=;Cu& zSY2HQgRjov0KrS6K=yOYm+kkccT_5Fo%EQ7eZeDw^h`Yi*`XBlwF_0N{GJY}#r$nz@U4Ex;kf9eALUF6?J2A7LcFZD{5xDX#O~CJ9E-xR-WBeZw*B zpxVu%Ak{FN;1Sd^_;`F*!~GmcwJs$RwiQg|e5w5M1X2em?tD|Ad(An^*hq`lP<=S@ z;W{8HWl^DDYp;<*R~zYJmD|o+_6e#~mLSR4SmrdjOOlr7}T9l9XsNOeLR66b)USp-6%=Goj+Q-jj$sQOV>15^Ea(oUW zY)ID}9!M{DCv7aBipQ2qY$*zpX#)1HM120%10?BvHoEpVdKi8owgFp zd39>>>0J_atCBF>Q53Y_bZWi$e}AGccTu;#KHNaPuTKk9;4nXX*ai^h?dP-kTZNIv zc(GAlllS!J9a;)1u6kaDwqdfze1|$6TBr-h)~TQfI}(fqRo^sEun>&oUmf%b*lEsA-mwFP z3IA8B^ZqUZ6{lEAD>e96tQZw2!l0nvL{xQwHyw_# z1BDFXKV9zs;np!6wV#n04?b*p(0^gw!@ZDH;zl}_b9I2B-X2LYSO|7J5%0$<2GuIY0T2aqqWtzMS#@vXhalz4pvp^Lf^@cb*ygMnj33@;>F2D_5vr zE5Ceu<;qoM;`=rVGUD-f(#0C_g~a2n((@~2L(CgjuE^NDe);U356Si%l^^{?*4e)3 zc@JQPo1KKd@KI}p;uf?etkXv4r>;?vN%#cpOyRa)RyOwqFElW0;;r~;SRZtBvljYF zQGw)kiEh?)f$ZjAd=w;i4m7-htB{8ky#rg$-qq7{j@FQK%+H}zX%AMUXmYY>RCUn!4_$|NLDmFH%A@@Zo7_={Id zJPJR2DYjGfSD#QlZ>{hy;ijynU=O@P`aci1UXbYB9D7jo50w8x02m#mxEG zrPa0M;qSMK`vS7{1s_lq@V3$jw*;<`|C|`8phD$JUi9NfTMj^(-&SQd{IQq^9vP+{gNnyL}EGeEhqSEfA%xeP| zu91PC1U?D<3pVgsAWaMjr_MuvIkq6#Tons#&A(J@-1zfslRlA}lZgzx*VnxtmH{SY zR3*%MRhw&TbN?N;N9umfPOeBW(>81y&{s6yHO}@Q5bPo(0pz?QJmAi^{s_O6#_=^T ze&~Fg!}YcT%ktGciN7?AQ2lupHeaSxW`KMr>bX$O=DhL!OTnMN11NqQ1S*v*-DDQT z_)s4TWTY7F(zWKvWmFv<*Y1{?C+)flw7dTY70I>F3p6q6Fj5`c_+KT0hrFAk*pB1= zV1B$$hI;WU@ypUkBGUg^t6Pdw8k_nsj#ga9cqaR4;$6aUm6r(ltBi1A(O!=KNFz6a zI68fN{$|;qSi|tD2mkrvNP(!Z*R!_&it8*czL?pqYy@5r*Uk`AU-{_%{}NVUpun|t zc5ZD^tlvSA^u7=#b9U4hlLP%9D_9n-M*Y&@FSac~1)`RW^bbLN;uHH1g7`c=UPR0O zXRf~s`QPvU2CrvE;HbYr_rtYvxJ-WM!@O|~)Rf20);{97eI0wP(*H;#M1_9+63BTs zG@9(c&}l|alF0Hn3;q$nK2pmCT*&sY5cn%9Fr_PbZ~C?h^zRbgQedYfF1%J|CFSLb zrnHHXC5wnR{Hq-HKm~eI&**Fg3x>ZlUb|IMaD{~n4CAYP{vTutS3W)>szmW)*W*k2 zXE)O%Ug*S8&;HBh<<_Dg1`cV2&SgkH(}@?_nl2ls{7)njC(pi>8AN~me#u{|*aHJ) zudlODR~r{GTt@$rLxG%^QcU;RB}gP-%0JJlY?|KkT}J=)c_7VOdfU=Zmm!_dX9igg zd*|t1Mt|!IF>oIJ(Z7Bf(iX46|0kh(^ys5Porjc*csDmUd50{a;=(CA3he|&Mq06f zI*kO~cUvGuiVSg?_|@|I!=;aQ&N{-An0Vm)G~Xm;l)U3?3nN1TUy7X())JY3Lk%ZN zVwU$J{$foyj1UPn8aBA00UU-z3Xx=L#v45N`Y)IBYk@8im! z1PfojTou(6{&o|#E7;zF)Ao7NFO|=G_Qi%S5vQnDXb9AtSF$_>dW3aIzaN{CeXYx_ zFpO8DuR+WFKTLmQrN|cZMzVI1|7H54C1Zs@`D;i>PeF0*YVaFU&3P#B*(cBJ0lVC;)W>3DY3v!B z4q~m4T)szP(vhsI+9g*bj<5S&5|#1?5(F^X6D<8JaD&TKn{?M%YMuT1oEp^IJ?O^z zne8*yg6erI$`q-OmsXuCSwY1!I=5jX*JNaXC4W*vOWY%sJt~6R0KuIrm15nB$S13e zwU|xb5}SaVwe-hD|BAVBNr}ev%AquGf6j53%Wc4^#rtzCAM_aK3mTsGOo;cV)n)>t zR}MY9`ihDhIxOFJiCsFgmp}RrOKxBjYZ%7)`@BN2HS0HpWtQB@?a3Lpab}vaxd*Z_ z{pPUPVKK7bcIw{8;cq#lLaF-bKng^6bEX%+8hK@J5UCW<|3RCq!-1bCk{Elr=V0Gl^y8 zT#-a@65!b$jN1`r$j|)C7q7sA%9k0wFqe=wX@Co_W7{%HLJa}IQzJ{G;}E|5W;_jV zRdlgEQA1gviDkj{3~3@fjglUplmtt;&;Eqst^7FuvmX)D4e9k(lf$HZf~r{ptdCOO zNSr7BZ$z(WE2zkPfGcw9{!NL*#6y2OGbru>wYvE2|5j$8_B@U*Ii$UPkok=KIJ8NTsWXYXLU!wJ|H0VQE!B6Fl(OCzCHi zQp}OUN}~g}*=VJ3oQrl1C-Nu$4YInJXqroE_GVnT-6U1J2kz{=ikeH+GXf|n9lA=< z7ihc95k`KFxkOmOuD4L8+wC&5yq;ck4N%I>YrC-ENUaQ~u)OPjaM;%cZr1+2aWw5p^6J+ketLG1iD1s?yef*9ey=`TwgC z{=4Y<-&}P4pCI(TR_R!f?nqoWYvbmIoS>f5;mBLbnzJxSK)|7_0b_Gzx9N9`XgOc+ zzQmD7kB@H>>sq3XM1tje%%mP(suwS7vpTH8JP{9+64&zz?gyXE-1y*$-;*qfX_*au zgml3loYPTFmhrz<_0XkQq%W>}c$!!}-^|+zDj0$>ns%?K_~UaV38k67glV~k@;5D! zvvda~^348l#4r%Z+hoJEyJL8|a}S7m3ePOJ5OyE7c)a^yDE!)Hr-?8llDE0= zkGj-ny+VwaNysDPbwI98YBH3*+(~)#15c^GxT&Apmy%Z0eXZT$w{(V~^@_Z=i{-gi zk-SygowEYHbhAz8=zFY#lFH0;1&)PIt@?K{m>ogyI>+TX#de0D}0Ao)&m9J1JVjppi!AM8{G@L!a_I0@myUMB`Ed9q0` zJ|;oLNOvrF%vDB^3*E^2PVpN|_<3^cHD9hts*ek>mp$dDN4905pw-umz!re=_xkup z_Cb6WE#jL%vV3SwF!%Dspb>st=p857HuEd3P~`0Ca#e$Nmp#O!e&r3SY-TM*9&mE@ zD8`(jM1dB0QaWMIN^Kl!%YpTzn%Nw$eJ`j)SmG(S%{Mb;NSa9lC-aKJen->9AS$3+t(D7Z}{8{_X zZHL;6inIf8@6Kj|A5ZM-mUZ5W?L3p5w-(nv{5$2VXs$8dkMvVJOa2<;yePK$!r5Xu?%T}#~ zDGW235&j$^DtIQ@8DM~+P~WA5WIrp|=_BuFEe!sSPZjYF;3h-9^~3DKSFqNdJd^>DI3_&pNf&52cSx2t-!?Is;ymIr1@44 z@CVoVsqWt5-{v-YIb#@<-kQE_rdx)0;;m-2yjVXTd1^#vL5i&z=%@|o+-i+%A*aIi z&l;$Bw9$<|KBTc8f1IP*jNdEsYpcaTJx{xL)AS+hKQqM^?>Lw9cqp?ShjYMX2@R#n z1+z6O!iUG>N+$=yfVO6EHdZn0GwHHiJ?*y#q3$I*Q zz#eyUYY|wD>Ybhst0ImJcbM2pr8*2u^<1Zx`8JnNSY!wvP9IxM{mON!-kFzQKX++x z5s<6!LiQ>}Za=>%coa{IIPfbVBs4Zf9A#uqos5sLPuFz5X_Y zJ}L*n##``YcWot8xj$HqX%Q+nJB)@7GlLBV?^sQtNf3KKAgSJs4+ujv;QQf%Y+G1x zIUl3qMb61w%Nz?7IM8|%VKODwBe&{=v;F*=c`OGYfgvaxg*U!pwUlVXbm@egur;>B zXGQu<+ap_}dUY9*PkQ&M^6L3FubL@sgczM1r*s=?nncO2X=oc?pywplB8{j{ogDz3 zyQpGQ$RQ_R>xO9=1Sts~mHiSASc8RtI%P4csaYEJ`E5p%^5vzTK(L?AtmsDnO{?{U z)su=L^*O*XIU>pqN7BcMK6anzbuSZ(KV0PwC#N>Rj-K?q-KnR+i(Ld95>6Je4_smw zgiiiR z_4ja&MFdvH&N?5ebru+$LrxLg8!V2yjBIPngh2q|#9awR0pn*ym{j=Pxt;LUzvD%e z2F75g3_6TKAEwQVpGKzO=VkoywdxM;l5(fNnTA%oqR;cb&1!x?vWh8!?(WK9nEXQ}ACK_jcOK8hVvt)Ca z`{3qypeHIMXdhAa_%Q)H5untOz6JWrsL_esz?hJ1f4}irR|(~qR1SK-uu2^ zJ{#NhD>yzAwHeEwO(@tc+Al{(AtZAaBhYLCz*0zSj*A1h)4d7(2mCmA zf9<@0ABttps+hN@`liSBEp;O@<`#D=b=fKqh+V|L^?Sj^AU(TH*r>bAWQG1! zik7C*qzVLCLYKjlUJu@y-E?c+GzOJm>fRdwj zD%#;R1EkiPvZl?n1~Ma~^*kHmm1?~(>f;Fh*ucfk_3WH13jV{Yba0+*t?mc|(o|zQ zM~!*dKiy>B*q56_>+d!3uDK-YsXaihTFwP{AZx8m<63H)8e-EpWrtUATxLwBMGY$X z7iQq&E`ff)4)cbJ#{RU)@F$SAppFCFcn07u3F=1f6}e1CI;6#K>$;yt5p)RC!KZ*3 z&3EDjQ7NZ0R_UA6iH!fmybkOAy~8$uc%hWW$zo#zwODHAWh|Ld0Rd#Uc=nydc7fXE zc)#}g{H}^L&XzrzN&{BTRRO66JBJMvV=y$5<9YLeu$=STRMevk{Vc2NXyy$?gDTO( zVZ$#yciex_PD+n1Z#neculAe#!j1K;*Zfe|mZ%mDw=o5LbVw{H5(Y@ALZO-#KR&ND0(&f+AyDyo5QXK&zCs zPRDv~|7!p$ucL%;YU=x<;hV+NK#lFpmzt4Mr$0-14?piej$FnLc9fX>TzGBu%7HwK&{)WUqcS2fwB>)mk1-&b{(2c?!LLSD&x zOq9kuT{Zt~BuNbXdYR>_<{u~2I)i1}c$*>hI@TFjzR-y8!kJkUJRD4?5R$P>0 zeSo-EYWMgL=cqfDeY`4+5^OOnYeUFEni#{*L!~cQvuYb}k_;W2uFHG@x_qWB;wq zHl}{NwE43>+OD`qZ5Q535Ep{XdJ0F~e)7R)^aUmE^@=xRBfYFkuM3J!Wld=8&A|jyWVVZQV?d(@=GUGU-Xi3p=r*GYG z-i)5Mfu8bt?1b-ZUA8!-Qf=iF+wPtpQVKb-al0eFuGEgX!2|UOz8idxV3psbXSD3? zEhiv~v#4wCSfxA=dLp1>qI;7S{?E=`0aO;Nc1=DevpEb|()#e_nleLojdRHL*f7c} zo4z$LqeIv4Y%B<61ekS~=LP8gVh&dcx=K0F#z_#J*HAp}9jmJ79k`v97WZYQ z<#3+w{@UlE;bl#Pw}bk~!E;nAowMIrCU~_l>sDv3E*+oVcPwug^!aO6qw1)UvpeS= zx)ZH1U&ektrYh1Ci1WzV4yKc3qTjiH38Z0JTMP!Ap{cRnK^m_P;S?0fs zm74wNeYwjd^K9ORSIxx`ceo2)Ip=cPO=;oJ=*^hs%IKA>i{*3#sDr^5O&`-Zb>2%p zK+i7SC@;M+>M9BSzWYo7Vm&{!#coA)rw#FGsU-q={%1IS2r8~8WGoh^+4@WJ-92M# zKe!Uo)cAZU_>{-VNa{3t8o@pPW+;R2cUaRPuUEiM6-T67fx4jR&NEZNWDt(iKqq8J zBp>FOcz91b!yVGpj!&?JE6qy4h678f?rz&jj_xE2J6#kz_JadTPV&)=yuaq%>@;~? zAK!KILyXlk7O}`mA~%Vml?Ye*0)U%W@>!G^$kpbe{+B-vSxzhTCQI zY-HL%L;Jc-?=GLBx+fy!kB6!fQJl{YZQ3M;a*$A|(RL>YlPmYP!w_I`nrk>ElH!+hh-2f##erR1Q z@I-A(BxA0ZySV4P{|5;RSI1+L*yPpjpH~xr-0ZE8iIf14vbYICpTMJQR%KEmbx^^nlEo)o2 zoZ)0Qw90p8CH*+-8a%hY<#Fta@nfCWW{T>!Tr`bJK>eS)8_dvj7WD2-e|?O75FpHhtEP9&c8bLKNs>F=e({(9trwkY95DRCgEB8Qn z{-oDa0J49g2H!{#tmxz)S5+NKXG;0o8u=#4qzzka(CDxi z26Sd}WuzL?lm(dOJCKY+oY8=}tVLN9%&kphAZkO2F0#9_w{dtM{&DvSY3qD9Icw^$ zXq)H7!fGB%`*-(3Ga!)8>)%)I*a2!=cWqwpDe>5I>}nWfpJYx? zxhzZeAFR~~3k`1%Mg?-i;JyLlbqj5X z*YE@ywIJct{cT9TYV-Eajea

    g@fKqda(=kdY_Cp!?}8RPyD0lrVowruPqV6Z?UF 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 BGsOS^ diff --git a/10-regular-expressions-javascript/6-regexp-greedy-and-lazy/witch_lazy5.png b/10-regular-expressions-javascript/6-regexp-greedy-and-lazy/witch_lazy5.png deleted file mode 100644 index 0a07eeaed8c2363e574e64d62f5e7d53a3eb5c83..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9045 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 JR*QcO`d`AZ2(kbG diff --git a/10-regular-expressions-javascript/6-regexp-greedy-and-lazy/witch_lazy6.png b/10-regular-expressions-javascript/6-regexp-greedy-and-lazy/witch_lazy6.png deleted file mode 100644 index 67f0d27ac35265e683e663423913530ced1745f8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9885 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 diff --git a/10-regular-expressions-javascript/6-regexp-greedy-and-lazy/witch_lazy6@2x.png b/10-regular-expressions-javascript/6-regexp-greedy-and-lazy/witch_lazy6@2x.png deleted file mode 100644 index e7eb1aa0efa99dfdf64deaa32573cde896b151cd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17631 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 F{|`ChGh6@w diff --git a/10-regular-expressions-javascript/7-regexp-groups/1-find-webcolor-3-or-6/solution.md b/10-regular-expressions-javascript/7-regexp-groups/1-find-webcolor-3-or-6/solution.md deleted file mode 100644 index ece24fb8..00000000 --- a/10-regular-expressions-javascript/7-regexp-groups/1-find-webcolor-3-or-6/solution.md +++ /dev/null @@ -1,30 +0,0 @@ -Регулярное выражение для поиска 3-значного цвета вида `#abc`: /#[a-f0-9]{3}/i. - -Нужно добавить ещё три символа, причём нужны именно три, четыре или семь символов не нужны. Эти три символа либо есть, либо нет. - -Самый простой способ добавить -- просто дописать в конец регэкспа: /#[a-f0-9]{3}([a-f0-9]{3})?/i - -Можно поступить и хитрее: /#([a-f0-9]{3}){1,2}/i. - -Здесь регэксп [a-f0-9]{3} заключён в скобки, чтобы квантификатор {1,2} применялся целиком ко всей этой структуре. - -В действии: -```js -//+ run -var re = /#([a-f0-9]{3}){1,2}/gi; - -var str = "color: #3f3; background-color: #AA00ef; and: #abcd"; - -alert( str.match(re) ); // #3f3 #AA0ef #abc -``` - -В последнем выражении #abcd было найдено совпадение #abc. Чтобы этого не происходило, добавим в конец \b: - -```js -//+ run -var re = /#([a-f0-9]{3}){1,2}\b/gi; - -var str = "color: #3f3; background-color: #AA00ef; and: #abcd"; - -alert( str.match(re) ); // #3f3 #AA0ef -``` diff --git a/10-regular-expressions-javascript/7-regexp-groups/1-find-webcolor-3-or-6/task.md b/10-regular-expressions-javascript/7-regexp-groups/1-find-webcolor-3-or-6/task.md deleted file mode 100644 index 419c0476..00000000 --- a/10-regular-expressions-javascript/7-regexp-groups/1-find-webcolor-3-or-6/task.md +++ /dev/null @@ -1,14 +0,0 @@ -# Найдите цвет в формате #abc или #abcdef - -Напишите регулярное выражение, которое находит цвет в формате `#abc` или `#abcdef`. То есть, символ `#`, после которого идут 3 или 6 шестнадцатиричных символа. - -Пример использования: -```js -var re = /* ваш регэксп */ - -var str = "color: #3f3; background-color: #AA00ef; and: #abcd"; - -alert( str.match(re) ); // #3f3 #AA0ef -``` - -P.S. Значения из любого другого количества букв, кроме 3 и 6, такие как `#abcd`, не должны подходить под регэксп. \ No newline at end of file diff --git a/10-regular-expressions-javascript/7-regexp-groups/2-parse-expression/solution.md b/10-regular-expressions-javascript/7-regexp-groups/2-parse-expression/solution.md deleted file mode 100644 index 05fedcd8..00000000 --- a/10-regular-expressions-javascript/7-regexp-groups/2-parse-expression/solution.md +++ /dev/null @@ -1,53 +0,0 @@ -Регулярное выражение для числа, возможно, дробного и отрицательного: -?\d+(\.\d+)?. Мы уже разбирали его в предыдущих задачах. - -Оператор -- это [-+*/]. Заметим, что дефис - идёт в списке первым, так как на любой позиции, кроме первой и последней, он имеет специальный смысл внутри [...], и его понадобилось бы экранировать. - -Кроме того, когда мы оформим это в JavaScript-синтаксис /.../ -- понадобится заэкранировать слэш /. - -Нам нужно число, затем оператор, затем число, и необязательные пробелы между ними. - -Полное регулярное выражение будет таким: -?\d+(\.\d+)?\s*[-+*/]\s*-?\d+(\.\d+)?. - -Чтобы получить результат в виде массива, добавим скобки вокруг тех данных, которые нам интересны, то есть -- вокруг чисел и оператора: (-?\d+(\.\d+)?)\s*([-+*/])\s*(-?\d+(\.\d+)?). - -Посмотрим в действии: -```js -//+ run -var re = /(-?\d+(\.\d+)?)\s*([-+*\/])\s*(-?\d+(\.\d+)?)/; - -alert( "1.2 + 12".match(re) ); -``` - -Итоговый массив будет включать в себя компоненты: - -

    - -Нам из этого массива нужны только числа и оператор. А, скажем, дробная часть сама по себе -- не нужна. - -Уберём её из запоминания, добавив в начало скобки ?:, то есть: (?:\.\d+)?. - -Итого, решение: - -```js -//+ run -function parse(expr) { - var re = /(-?\d+(?:\.\d+)?)\s*([-+*\/])\s*(-?\d+(?:\.\d+)?)/; - - var result = expr.match(re); - - if (!result) return; - result.shift(); - - return result; -} - -alert( parse("-1.23 * 3.45") ); // -1.23, *, 3.45 -``` - diff --git a/10-regular-expressions-javascript/7-regexp-groups/2-parse-expression/task.md b/10-regular-expressions-javascript/7-regexp-groups/2-parse-expression/task.md deleted file mode 100644 index c48e5a0c..00000000 --- a/10-regular-expressions-javascript/7-regexp-groups/2-parse-expression/task.md +++ /dev/null @@ -1,20 +0,0 @@ -# Разобрать выражение - -Арифметическое выражение состоит из двух чисел и операции между ними, например: -
      -
    • `1 + 2`
    • -
    • `1.2 * 3.4`
    • -
    • `-3 / -6`
    • -
    • `-2 - 2`
    • -
    - -Список операций: `"+"`, `"-"`, `"*"` и `"/"`. - -Также могут присутсововать пробелы вокруг оператора и чисел. - -Напишите функцию, которая будет получать выражение и возвращать массив из трёх аргументов: -
      -
    1. Первое число.
    2. -
    3. Оператор.
    4. -
    5. Второе число.
    6. -
    diff --git a/10-regular-expressions-javascript/7-regexp-groups/article.md b/10-regular-expressions-javascript/7-regexp-groups/article.md deleted file mode 100644 index 515c6175..00000000 --- a/10-regular-expressions-javascript/7-regexp-groups/article.md +++ /dev/null @@ -1,150 +0,0 @@ -# Скобочные группы - -Часть шаблона может быть заключена в скобки (...). Такие выделенные части шаблона называют "скобочными выражениями" или "скобочными группами". - -У такого выделения есть два эффекта: -
      -
    1. Он позволяет выделить часть совпадения в отдельный элемент массива при поиске через [String#match](https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/String/match) или [RegExp#exec](https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/RegExp/exec).
    2. -
    3. Если поставить квантификатор после скобки, то он применится *ко всей скобке*, а не всего лишь к одному символу.
    4. -
    - -[cut] - -## Пример - -В примере ниже, шаблон (go)+ находит один или более повторяющихся 'go': - -```js -//+ run -alert( 'Gogogo now!'.match(/(go)+/i ); // "Gogogo" -``` - -Без скобок, шаблон /go+/ означал бы g, после которого идёт одна или более o, например: goooo. А скобки "группируют" (go) вместе. - - -## Содержимое группы - -Скобки нумеруются слева направо. Поисковой движок запоминает содержимое каждой скобки и позволяет обращаться к нему -- в шаблоне и строке замены и, конечно же, в результатах. - -Например, найти HTML-тег можно шаблоном <.*?>. - -После поиска мы захотим что-то сделать с результатом. Для удобства заключим содержимое `<...>` в скобки: <(.*?)>. Тогда оно будет доступно отдельно. - -При поиске методом [String#match](https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/String/match) в результирующем массиве будет сначала всё совпадение, а далее -- скобочные группы. В шаблоне <(.*?)> скобочная группа только одна: - -```js -//+ run -var str = '

    Привет, мир!

    '; -var reg = /<(.*?)>/; - -alert( str.match(reg) ); // массив:

    , h1 -``` - -Заметим, что метод [String#match](https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/String/match) выдаёт скобочные группы только при поиске без флага `/.../g`. В примере выше он нашёл только первое совпадение <h1>, а закрывающий </h1> не нашёл, поскольку без флага `/.../g` ищется только первое совпадение. - -Для того, чтобы искать и с флагом `/.../g` и со скобочными группами, используется метод [RegExp#exec](https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/RegExp/exec): - -```js -//+ run -var str = '

    Привет, мир!

    '; -var reg = /<(.*?)>/g; - -var match; - -while ((match = reg.exec(str)) !== null) { - // сначала выведет первое совпадение:

    ,h1 - // затем выведет второе совпадение:

    ,/h1 - alert(match); -} -``` - -Теперь найдено оба совпадения <(.*?)>, каждое -- массив из полного совпадения и скобочных групп (одна в данном случае). - -## Вложенные группы -Скобки могут быть и вложенными. В этом случае нумерация также идёт слева направо. - -Например, при поиске тега в <span class="my"> нас может интересовать: - -
      -
    1. Содержимое тега целиком: `span class="my"`.
    2. -
    3. В отдельную переменную для удобства хотелось бы поместить тег: `span`.
    4. -
    5. Также может быть удобно отдельно выделить атрибуты `class="my"`.
    6. -
    - -Добавим скобки в регулярное выражение: - -```js -//+ run -var str = ''; - -reg = /<(([a-z]+)\s*([^>]*))>/; - -alert( str.match(reg) ); // , span, s -``` - -Вот так выглядят скобочные группы: - - - -На нулевом месте -- всегда совпадение полностью, далее -- группы. Нумерация всегда идёт слева направо, по открывающей скобке. - -В данном случае получилось, что группа 1 включает в себя содержимое групп 2 и 3. Это совершенно нормальная ситуация, которая возникает, когда нужно выделить что-то отдельное внутри большей группы. - -**Даже если скобочная группа необязательна и не входит в совпадение, соответствующий элемент массива существует (и равен `undefined`).** - -Например, рассмотрим регэксп a(z)?(c)?. Он ищет `"a"`, за которой не обязательно идёт буква `"z"`, за которой необязательно идёт буква `"c"`. - -Если напустить его на строку из одной буквы `"a"`, то результат будет таков: - -```js -//+ run -match = 'a'.match(/a(z)?(c)?/) - -alert( match.length ); // 3 -alert( match[0] ); // a -alert( match[1] ); // undefined -alert( match[2] ); // undefined -``` - -Массив получился длины `3`, но все скобочные группы -- `undefined`. - -А теперь более сложная ситуация, строка ack: - -```js -//+ run -match = 'ack'.match(/a(z)?(c)?/) - -alert( match.length ); // 3 -alert( match[0] ); // ac, всё совпадение -alert( match[1] ); // undefined, для (z)? ничего нет -alert( match[2] ); // c -``` - -Длина массива результатов по-прежнему `3`. Она постоянна. А вот для скобочной группы (z)? в ней ничего нет, поэтому результат: `["ac", undefined, "c"]`. - -## Исключение из запоминания через ?: - -Бывает так, что скобки нужны, чтобы квантификатор правильно применился, а вот запоминать её в массиве не нужно. - -Скобочную группу можно исключить из запоминаемых и нумеруемых, добавив в её начало ?:. - -Например, мы хотим найти (go)+, но содержимое скобок (`go`) в отдельный элемент массива выделять не хотим. - -Для этого нужно сразу после открывающей скобки поставить `?:`, то есть: (?:go)+. - -Например: - -```js -//+ run -var str = "Gogo John!"; -*!* -var reg = /(?:go)+ (\w+)/i; -*/!* - -var result = str.match(reg); - -alert( result.length ); // 2 -alert( result[1] ); // John -``` - -В примере выше массив результатов имеет длину `2` и содержит только полное совпадение и результат (\w+). Это удобно в тех случаях, когда содержимое скобок нас не интересует. diff --git a/10-regular-expressions-javascript/7-regexp-groups/regexp-nested-groups.png b/10-regular-expressions-javascript/7-regexp-groups/regexp-nested-groups.png deleted file mode 100644 index 9103ea28a519f3ee256d192daeee4210d80674e2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12959 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 diff --git a/10-regular-expressions-javascript/7-regexp-groups/regexp-nested-groups@2x.png b/10-regular-expressions-javascript/7-regexp-groups/regexp-nested-groups@2x.png deleted file mode 100644 index 4f5ee487641d2fe54c8a98c1b1e0c158ab805cd8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24479 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 diff --git a/10-regular-expressions-javascript/8-regexp-backreferences/1-find-matching-bbtags/solution.md b/10-regular-expressions-javascript/8-regexp-backreferences/1-find-matching-bbtags/solution.md deleted file mode 100644 index 234032d4..00000000 --- a/10-regular-expressions-javascript/8-regexp-backreferences/1-find-matching-bbtags/solution.md +++ /dev/null @@ -1,21 +0,0 @@ - -Открывающий тег -- это \[(b|url|quote)\]. - -Для того, чтобы найти всё до закрывающего -- используем ленивый поиск [\s\S]*? и обратную ссылку на открывающий тег. - -Итого, получится: \[(b|url|quote)\][\s\S]*?\[/\1\]. - -В действии: - -```js -//+ run -var re = /\[(b|url|quote)\][\s\S]*?\[\/\1\]/g; - -var str1 = "..[url]http://ya.ru[/url].."; -var str2 = "..[url][b]http://ya.ru[/b][/url].."; - -alert( str1.match(re) ); // [url]http://ya.ru[/url] -alert( str2.match(re) ); // [url][b]http://ya.ru[/b][/url] -``` - -Для закрывающего тега `[/1]` понадобилось дополнительно экранировать слеш: `\[\/1\]`. diff --git a/10-regular-expressions-javascript/8-regexp-backreferences/1-find-matching-bbtags/task.md b/10-regular-expressions-javascript/8-regexp-backreferences/1-find-matching-bbtags/task.md deleted file mode 100644 index 8596bed5..00000000 --- a/10-regular-expressions-javascript/8-regexp-backreferences/1-find-matching-bbtags/task.md +++ /dev/null @@ -1,41 +0,0 @@ -# Найдите пары тегов - -ББ-тег имеет вид `[имя]...[/имя]`, где имя -- слово, одно из: `b`, `url`, `quote`. - -Например: -``` -[b]текст[/b] -[url]http://ya.ru[/url] -``` - -ББ-теги могут быть вложенными, но сам в себя тег быть вложен не может, например: - -``` -Допустимо: -[url] [b]http://ya.ru[/b] [/url] -[quote] [b]текст[/b] [/quote] - -Нельзя: -[b][b]текст[/b][/b] -``` - -Создайте регулярное выражение для поиска ББ-тегов и их содержимого. - -Например: - -```js -var re = /* регулярка */ - -var str = "..[url]http://ya.ru[/url].."; -alert( str.match(re) ); // [url]http://ya.ru[/url] -``` - -Если теги вложены, то нужно искать самый внешний тег (при желании можно будет продолжить поиск в его содержимом): - -```js -var re = /* регулярка */ - -var str = "..[url][b]http://ya.ru[/b][/url].."; -alert( str.match(re) ); // [url][b]http://ya.ru[/b][/url] -``` - diff --git a/10-regular-expressions-javascript/8-regexp-backreferences/article.md b/10-regular-expressions-javascript/8-regexp-backreferences/article.md deleted file mode 100644 index 3814da12..00000000 --- a/10-regular-expressions-javascript/8-regexp-backreferences/article.md +++ /dev/null @@ -1,68 +0,0 @@ -# Обратные ссылки: \n и $n - -Скобочные группы можно не только получать в результате. - -Движок регулярных выражений запоминает их содержимое, и затем его можно использовать как в самом паттерне, так и в строке замены. - -[cut] - -## Группа в строке замены - -Ссылки в строке замены имеют вид `$n`, где `n` -- это номер скобочной группы. - -Вместо `$n` подставляется содержимое соответствующей скобки: - -```js -//+ run -var name = "Александр Пушкин"; - -name = name.replace(/([а-яё]+) ([а-яё]+)/i, *!*"$2, $1"*/!*); -alert( name ); // Пушкин, Александр -``` - -В примере выше вместо $2 подставляется второе найденное слово, а вместо $1 -- первое. - -## Группа в шаблоне - -Выше был пример использования содержимого групп в строке замены. Это удобно, когда нужно реорганизовать содержимое или создать новое с использованием старого. - -Но к скобочной группе можно также обратиться в самом поисковом шаблоне, ссылкой вида `\номер`. - -Чтобы было яснее, рассмотрим это на реальной задаче -- необходимо найти в тексте строку в кавычках. Причём кавычки могут быть одинарными '...' или двойными "..." -- и то и другое должно искаться корректно. - -Как такие строки искать? - -Можно в регэкспе предусмотреть произвольные кавычки: `['"](.*?)['"]`. Такой регэксп найдёт строки вида "...", '...', но он даст неверный ответ в случае, если одна кавычка ненароком оказалась внутри другой, как например в строке "She's the one!": - -```js -//+ run -str = "He said: \"She's the one!\"."; - -reg = /['"](.*?)['"]/g; - -// Результат не соответствует замыслу -alert( str.match(reg) ); // "She' -``` - -Как видно, регэксп нашёл открывающую кавычку ", затем текст, вплоть до новой кавычки ', которая закрывает соответствие. - -Для того, чтобы попросить регэксп искать закрывающую кавычку -- такую же, как открывающую, мы обернём её в скобочную группу и используем обратную ссылку на неё: - -```js -//+ run -str = "He said: \"She's the one!\"."; - -reg = /(['"])(.*?)\1/g; - -alert( str.match(reg) ); // "She's the one!" -``` - -Теперь работает верно! Движок регулярных выражений, найдя первое скобочное выражение -- кавычку (['"]), запоминает его и далее \1 означает "найти то же самое, что в первой скобочной группе". - -Обратим внимание на два нюанса: - -
      -
    • Чтобы использовать скобочную группу в строке замены -- нужно использовать ссылку вида `$1`, а в шаблоне -- обратный слэш: `\1`.
    • -
    • Чтобы в принципе иметь возможность обратиться к скобочной группе -- не важно откуда, она не должна быть исключена из запоминаемых при помощи `?:`. Скобочные группы вида `(?:...)` не участвуют в нумерации.
    • -
    - diff --git a/10-regular-expressions-javascript/9-regexp-alternation/1-find-programming-language/solution.md b/10-regular-expressions-javascript/9-regexp-alternation/1-find-programming-language/solution.md deleted file mode 100644 index 483f818e..00000000 --- a/10-regular-expressions-javascript/9-regexp-alternation/1-find-programming-language/solution.md +++ /dev/null @@ -1,36 +0,0 @@ -Сначала неправильный способ. - -Если перечислить языки один за другим через `|`, то получится совсем не то: - -```js -//+ run -var reg = /Java|JavaScript|PHP|C|C\+\+/g; - -var str = "Java, JavaScript, PHP, C, C++"; - -alert( str.match(reg) ); // Java,Java,PHP,C,C -``` - -Как видно, движок регулярных выражений ищет альтернации в порядке их перечисления. То есть, он сначала смотрит, есть ли Java, а если нет -- ищет JavaScript. - -Естественно, при этом JavaScript не будет найдено никогда. - -То же самое -- с языками C и C++. - -Есть два решения проблемы: - -
      -
    1. Поменять порядок, чтобы более длинное совпадение проверялось первым: JavaScript|Java|C\+\+|C|PHP.
    2. -
    3. Соединить длинный вариант с коротким: Java(Script)?|C(\+\+)?|PHP.
    4. -
    - -В действии: - -```js -//+ run -var reg = /Java(Script)?|C(\+\+)?|PHP/g; - -var str = "Java, JavaScript, PHP, C, C++"; - -alert( str.match(reg) ); // Java,JavaScript,PHP,C,C++ -``` diff --git a/10-regular-expressions-javascript/9-regexp-alternation/1-find-programming-language/task.md b/10-regular-expressions-javascript/9-regexp-alternation/1-find-programming-language/task.md deleted file mode 100644 index b93570f3..00000000 --- a/10-regular-expressions-javascript/9-regexp-alternation/1-find-programming-language/task.md +++ /dev/null @@ -1,6 +0,0 @@ -# Найдите языки программирования - -Существует много языков программирования, например Java, JavaScript, PHP, C, C++. - -Напишите регулярное выражение, которое найдёт их все в строке "Java JavaScript PHP C++ C" - diff --git a/10-regular-expressions-javascript/9-regexp-alternation/2-match-quoted-string/solution.md b/10-regular-expressions-javascript/9-regexp-alternation/2-match-quoted-string/solution.md deleted file mode 100644 index c959b6fa..00000000 --- a/10-regular-expressions-javascript/9-regexp-alternation/2-match-quoted-string/solution.md +++ /dev/null @@ -1,19 +0,0 @@ -Решение задачи: /"(\\.|[^"\\])*"/g. - -То есть: -
      -
    • Сначала ищем кавычку "
    • -
    • Затем, если далее слэш \\ (удвоение слэша -- техническое, для вставки в регэксп, на самом деле там один слэш), то после него также подойдёт любой символ (точка).
    • -
    • Если не слэш, то берём любой символ, кроме кавычек (которые будут означать конец строки) и слэша (чтобы предотвратить одинокие слэши, сам по себе единственный слэш не нужен, он должен экранировать какой-то символ) [^"\\]
    • -
    • ...И так жадно, до закрывающей кавычки.
    • -
    - -В действии: - -```js -//+ run -var re = /"(\\.|[^"\\])*"/g; -var str = '.. "test me" .. "Скажи \\"Привет\\"!" .. "\\r\\n\\\\" ..'; - -alert( str.match(re) ); // "test me","Скажи \"Привет\"!","\r\n\\" -``` \ No newline at end of file diff --git a/10-regular-expressions-javascript/9-regexp-alternation/2-match-quoted-string/task.md b/10-regular-expressions-javascript/9-regexp-alternation/2-match-quoted-string/task.md deleted file mode 100644 index 4db27891..00000000 --- a/10-regular-expressions-javascript/9-regexp-alternation/2-match-quoted-string/task.md +++ /dev/null @@ -1,26 +0,0 @@ -# Найдите строки в кавычках - -Найдите в тексте при помощи регэкспа строки в двойных кавычках "...". - -В строке поддерживается экранирование при помощи слеша -- примерно в таком же виде, как в обычных строках JavaScript. То есть, строка может содержать любые символы, экранированные слэшем, в частности: \", \n, и даже сам слэш в экранированном виде: \\. - -Здесь особо важно, что двойная кавычка после слэша не оканчивает строку, а считается её частью. В этом и состоит основная сложность задачи, которая без этого условия была бы элементарной. - -Пример совпадающих строк: -```js -.. *!*"test me"*/!* .. (обычная строка) -.. *!*"Скажи \"Привет\"!"*/!* ... (строка с кавычками внутри) -.. *!*"\r\n\\"*/!* .. (строка со спец. символами и слэшем внутри) -``` - -Заметим, что в JavaScript такие строки удобнее всего задавать в одинарных кавычках, и слеши придётся удвоить (в одинарных кавычках они являются экранирующими символами): - -Пример задания тестовой строки в JavaScript: -```js -//+ run -var str = ' .. "test me" .. "Скажи \\"Привет\\"!" .. "\\r\\n\\\\" .. '; - -// эта строка будет такой: -alert(str); // .. "test me" .. "Скажи \"Привет\"!" .. "\r\n\\" .. -``` - diff --git a/10-regular-expressions-javascript/9-regexp-alternation/3-match-exact-tag/solution.md b/10-regular-expressions-javascript/9-regexp-alternation/3-match-exact-tag/solution.md deleted file mode 100644 index 0a422af1..00000000 --- a/10-regular-expressions-javascript/9-regexp-alternation/3-match-exact-tag/solution.md +++ /dev/null @@ -1,18 +0,0 @@ - -Начало шаблона очевидно: ``pattern``, так как ``match`` удовлетворяет этому регэкспу. - -Нужно уточнить его. После ``match`|\s.*?>)`. - -В действии: - -```js -//+ run -var re = /|\s.*?>)/g; - -alert( " - - - - -
    - hh:mm:ss -
    - - - - - - \ No newline at end of file diff --git a/2-ui/1-document/11-modifying-document/10-clock-setinterval/source.view/index.html b/2-ui/1-document/11-modifying-document/10-clock-setinterval/source.view/index.html deleted file mode 100644 index 9120728f..00000000 --- a/2-ui/1-document/11-modifying-document/10-clock-setinterval/source.view/index.html +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/2-ui/1-document/11-modifying-document/10-clock-setinterval/task.md b/2-ui/1-document/11-modifying-document/10-clock-setinterval/task.md deleted file mode 100644 index e422846b..00000000 --- a/2-ui/1-document/11-modifying-document/10-clock-setinterval/task.md +++ /dev/null @@ -1,8 +0,0 @@ -# Часики с использованием "setInterval" - -[importance 4] - -Создайте цветные часики как в примере ниже: - -[iframe src="solution" height=100] - diff --git a/2-ui/1-document/11-modifying-document/2-remove-polyfill/solution.md b/2-ui/1-document/11-modifying-document/2-remove-polyfill/solution.md deleted file mode 100644 index bd99772f..00000000 --- a/2-ui/1-document/11-modifying-document/2-remove-polyfill/solution.md +++ /dev/null @@ -1,23 +0,0 @@ -Родителя `parentNode` можно получить из `elem`. - -Вот так выглядит решение: -```html -//+ run -
    Это
    -
    Все
    -
    Элементы DOM
    - - -``` \ No newline at end of file diff --git a/2-ui/1-document/11-modifying-document/2-remove-polyfill/task.md b/2-ui/1-document/11-modifying-document/2-remove-polyfill/task.md deleted file mode 100644 index a212fdc0..00000000 --- a/2-ui/1-document/11-modifying-document/2-remove-polyfill/task.md +++ /dev/null @@ -1,28 +0,0 @@ -# Удаление элементов - -[importance 5] - -Напишите полифилл для метода `remove` для старых браузеров. - -Вызов `elem.remove()`: -
      -
    • Если у `elem` нет родителя -- ничего не делает.
    • -
    • Если есть -- удаляет элемент из родителя.
    • -
    - -```html -
    Это
    -
    Все
    -
    Элементы DOM
    - - -``` - diff --git a/2-ui/1-document/11-modifying-document/3-insert-after/solution.md b/2-ui/1-document/11-modifying-document/3-insert-after/solution.md deleted file mode 100644 index 4436bdcb..00000000 --- a/2-ui/1-document/11-modifying-document/3-insert-after/solution.md +++ /dev/null @@ -1,29 +0,0 @@ -Для того, чтобы добавить элемент *после* `refElem`, мы можем, используя `insertBefore`, вставить его *перед* `refElem.nextSibling`. - -Но что если `nextSibling` нет? Это означает, что `refElem` является последним потомком своего родителя и можем использовать `appendChild`. - -Код: - -```js -function insertAfter(elem, refElem) { - var parent = refElem.parentNode; - var next = refElem.nextSibling; - if (next) { - return parent.insertBefore(elem, next); - } else { - return parent.appendChild(elem); - } -} -``` - -Но код может быть гораздо короче, если вспомнить, что `insertBefore` со вторым аргументом null работает как `appendChild`: - -```js -function insertAfter(elem, refElem) { - return refElem.parentNode.insertBefore(elem, refElem.nextSibling); -} -``` - -Если нет `nextSibling`, то второй аргумент `insertBefore` становится `null` и тогда `insertBefore(elem, null)` осуществит вставку в конец, как и требуется. - -В решении нет проверки на существование `refElem.parentNode`, поскольку вставка после элемента без родителя -- уже ошибка, пусть она возникнет в функции, это нормально. \ No newline at end of file diff --git a/2-ui/1-document/11-modifying-document/3-insert-after/task.md b/2-ui/1-document/11-modifying-document/3-insert-after/task.md deleted file mode 100644 index d5fa5329..00000000 --- a/2-ui/1-document/11-modifying-document/3-insert-after/task.md +++ /dev/null @@ -1,26 +0,0 @@ -# insertAfter - -[importance 5] - -Напишите функцию `insertAfter(elem, refElem)`, которая добавит `elem` после узла `refElem`. - -```html -
    Это
    -
    Элементы
    - - -``` - diff --git a/2-ui/1-document/11-modifying-document/4-remove-children/solution.md b/2-ui/1-document/11-modifying-document/4-remove-children/solution.md deleted file mode 100644 index 3ca743c4..00000000 --- a/2-ui/1-document/11-modifying-document/4-remove-children/solution.md +++ /dev/null @@ -1,54 +0,0 @@ -# Неправильное решение - -Для начала рассмотрим забавный пример того, как делать *не надо*: - -```js -function removeChildren(elem) { - for (var k = 0; k < elem.childNodes.length; k++) { - elem.removeChild(elem.childNodes[k]); - } -} -``` - -Если вы попробуете это на практике, то увидите, то это не сработает. - -Не сработает потому, что коллекция `childNodes` всегда начинается с индекса 0 и автоматически обновляется, когда первый потомок удален(т.е. тот, что был вторым, станет первым). А переменная `k` в цикле всё время увеличивается, поэтому такой цикл пропустит половину узлов. - -# Решение через DOM - -Правильное решение: - -```js -function removeChildren(elem) { - while (elem.lastChild) { - elem.removeChild(elem.lastChild); - } -} -``` - -# Альтернатива через innerHTML - -Можно и просто обнулить содержимое через `innerHTML`: - -```js -function removeChildren(elem) { - elem.innerHTML = ''; -} -``` - -Это не будет работать в IE8- для таблиц, так как на большинстве табличных элементов (кроме ячеек `TH/TD`) в старых IE запрещено менять `innerHTML`. - -Впрочем, можно завернуть `innerHTML` в `try/catch`: - -```js -function removeChildren(elem) { - try { - elem.innerHTML = ''; - } catch (e) { - while (elem.firstChild) { - elem.removeChild(elem.firstChild); - } - } -} -``` - diff --git a/2-ui/1-document/11-modifying-document/4-remove-children/task.md b/2-ui/1-document/11-modifying-document/4-remove-children/task.md deleted file mode 100644 index e6b7cb74..00000000 --- a/2-ui/1-document/11-modifying-document/4-remove-children/task.md +++ /dev/null @@ -1,29 +0,0 @@ -# removeChildren - -[importance 5] - -Напишите функцию `removeChildren`, которая удаляет всех потомков элемента. - -```html - - - - - - -
    ЭтоВсеЭлементы DOM
    - -
      -
    1. Вася
    2. -
    3. Петя
    4. -
    5. Маша
    6. -
    7. Даша
    8. -
    - - -``` diff --git a/2-ui/1-document/11-modifying-document/5-why-aaa/solution.md b/2-ui/1-document/11-modifying-document/5-why-aaa/solution.md deleted file mode 100644 index 452540b9..00000000 --- a/2-ui/1-document/11-modifying-document/5-why-aaa/solution.md +++ /dev/null @@ -1,5 +0,0 @@ -HTML в задаче некорректен. В этом всё дело. И вопрос легко решится, если открыть отладчик. - -В нём видно, что браузер поместил текст `aaa` *перед* таблицей. Поэтому он и остался в документе. - -Вообще, в стандарте HTML5 описано, как браузеру обрабатывать некорректный HTML, так что такое действие браузера является правильным. \ No newline at end of file diff --git a/2-ui/1-document/11-modifying-document/5-why-aaa/task.md b/2-ui/1-document/11-modifying-document/5-why-aaa/task.md deleted file mode 100644 index d0d6d4df..00000000 --- a/2-ui/1-document/11-modifying-document/5-why-aaa/task.md +++ /dev/null @@ -1,25 +0,0 @@ -# Почему остаётся "ааа" ? - -[importance 1] - -Запустите этот пример. Почему вызов `removeChild` не удалил текст `"aaa"`? - -```html - - - aaa - - - -
    Test
    - - -``` - diff --git a/2-ui/1-document/11-modifying-document/6-create-list/solution.md b/2-ui/1-document/11-modifying-document/6-create-list/solution.md deleted file mode 100644 index f3689eb4..00000000 --- a/2-ui/1-document/11-modifying-document/6-create-list/solution.md +++ /dev/null @@ -1,4 +0,0 @@ - -Делаем цикл, пока посетитель что-то вводит -- добавляет `
  • `. - -Содержимое в `
  • ` присваиваем через `document.createTextNode`, чтобы правильно работали <, > и т.д. diff --git a/2-ui/1-document/11-modifying-document/6-create-list/solution.view/index.html b/2-ui/1-document/11-modifying-document/6-create-list/solution.view/index.html deleted file mode 100755 index 254844e3..00000000 --- a/2-ui/1-document/11-modifying-document/6-create-list/solution.view/index.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - -

    Создание списка

    - - - - - - \ No newline at end of file diff --git a/2-ui/1-document/11-modifying-document/6-create-list/task.md b/2-ui/1-document/11-modifying-document/6-create-list/task.md deleted file mode 100644 index f703837f..00000000 --- a/2-ui/1-document/11-modifying-document/6-create-list/task.md +++ /dev/null @@ -1,18 +0,0 @@ -# Создать список - -[importance 4] - -Напишите интерфейс для создания списка. - -Для каждого пункта: -
      -
    1. Запрашивайте содержимое пункта у пользователя с помощью `prompt`.
    2. -
    3. Создавайте пункт и добавляйте его к `UL`.
    4. -
    5. Процесс прерывается, когда пользователь нажимает ESC или вводит пустую строку.
    6. -
    - -**Все элементы должны создаваться динамически.** - -Если посетитель вводит теги -- пусть в списке они показываются как обычный текст. - -[demo src="solution"] diff --git a/2-ui/1-document/11-modifying-document/7-create-object-tree/build-tree-dom.view/index.html b/2-ui/1-document/11-modifying-document/7-create-object-tree/build-tree-dom.view/index.html deleted file mode 100755 index 50428719..00000000 --- a/2-ui/1-document/11-modifying-document/7-create-object-tree/build-tree-dom.view/index.html +++ /dev/null @@ -1,70 +0,0 @@ - - - - - - - - - -
    - - - - - - \ No newline at end of file diff --git a/2-ui/1-document/11-modifying-document/7-create-object-tree/solution.md b/2-ui/1-document/11-modifying-document/7-create-object-tree/solution.md deleted file mode 100644 index ff334e70..00000000 --- a/2-ui/1-document/11-modifying-document/7-create-object-tree/solution.md +++ /dev/null @@ -1,6 +0,0 @@ -Решения через рекурсию. - -
      -
    1. [edit src="solution"]Через innerHTML[/edit].
    2. -
    3. [edit src="build-tree-dom"]Через DOM[/edit].
    4. -
    \ No newline at end of file diff --git a/2-ui/1-document/11-modifying-document/7-create-object-tree/solution.view/index.html b/2-ui/1-document/11-modifying-document/7-create-object-tree/solution.view/index.html deleted file mode 100755 index fc4cae62..00000000 --- a/2-ui/1-document/11-modifying-document/7-create-object-tree/solution.view/index.html +++ /dev/null @@ -1,52 +0,0 @@ - - - - - - - - - -
    - - - - - \ No newline at end of file diff --git a/2-ui/1-document/11-modifying-document/7-create-object-tree/source.view/index.html b/2-ui/1-document/11-modifying-document/7-create-object-tree/source.view/index.html deleted file mode 100755 index 9a64f587..00000000 --- a/2-ui/1-document/11-modifying-document/7-create-object-tree/source.view/index.html +++ /dev/null @@ -1,67 +0,0 @@ - - - - - - - - - -
    - - - - - - - - \ No newline at end of file diff --git a/2-ui/1-document/11-modifying-document/7-create-object-tree/task.md b/2-ui/1-document/11-modifying-document/7-create-object-tree/task.md deleted file mode 100644 index 25eb80be..00000000 --- a/2-ui/1-document/11-modifying-document/7-create-object-tree/task.md +++ /dev/null @@ -1,50 +0,0 @@ -# Создайте дерево из объекта - -[importance 5] - -Напишите функцию, которая создаёт вложенный список `UL/LI` (дерево) из объекта. - -Например: - -```js -var data = { - "Рыбы": { - "Форель": {}, - "Щука": {} - }, - - "Деревья": { - "Хвойные": { - "Лиственница": {}, - "Ель": {} - }, - "Цветковые": { - "Берёза": {}, - "Тополь": {} - } - } -}; -``` - -Синтаксис: - -```js -var container = document.getElementById('container'); -*!* -createTree(container, data); // создаёт -*/!* -``` - -Результат (дерево): - -[iframe border=1 src="solution"] - -Выберите один из двух способов решения этой задачи: -
      -
    1. Создать строку, а затем присвоить через `container.innerHTML`.
    2. -
    3. Создавать узлы через методы DOM.
    4. -
    - -Если получится -- сделайте оба. - -P.S. Желательно, чтобы в дереве не было лишних элементов, в частности -- пустых `
      ` на нижнем уровне. \ No newline at end of file diff --git a/2-ui/1-document/11-modifying-document/8-tree-count/solution.md b/2-ui/1-document/11-modifying-document/8-tree-count/solution.md deleted file mode 100644 index 539da988..00000000 --- a/2-ui/1-document/11-modifying-document/8-tree-count/solution.md +++ /dev/null @@ -1,8 +0,0 @@ -# Подсказки - -
        -
      1. Получить количество вложенных узлов можно через `elem.getElementsByTagName('*').length`.
      2. -
      3. Текст в начале `
      4. ` доступен как `li.firstChild`, его содержимое -- `li.firstChild.data`.
      5. -
      - -# Решение \ No newline at end of file diff --git a/2-ui/1-document/11-modifying-document/8-tree-count/solution.view/index.html b/2-ui/1-document/11-modifying-document/8-tree-count/solution.view/index.html deleted file mode 100644 index 736bfa9f..00000000 --- a/2-ui/1-document/11-modifying-document/8-tree-count/solution.view/index.html +++ /dev/null @@ -1,64 +0,0 @@ - - - - - - - - - -
        -
      • Животные -
          -
        • Млекопитающие -
            -
          • Коровы
          • -
          • Ослы
          • -
          • Собаки
          • -
          • Тигры
          • -
          -
        • -
        • Другие -
            -
          • Змеи
          • -
          • Птицы
          • -
          • Ящерицы
          • -
          -
        • -
        -
      • -
      • Рыбы -
          -
        • Аквариумные -
            -
          • Гуппи
          • -
          • Скалярии
          • -
          - -
        • -
        • Морские -
            -
          • Морская форель
          • -
          -
        • -
        -
      • -
      - - - - - - \ No newline at end of file diff --git a/2-ui/1-document/11-modifying-document/8-tree-count/source.view/index.html b/2-ui/1-document/11-modifying-document/8-tree-count/source.view/index.html deleted file mode 100644 index 2f45460c..00000000 --- a/2-ui/1-document/11-modifying-document/8-tree-count/source.view/index.html +++ /dev/null @@ -1,54 +0,0 @@ - - - - - - - - - -
        -
      • Животные -
          -
        • Млекопитающие -
            -
          • Коровы
          • -
          • Ослы
          • -
          • Собаки
          • -
          • Тигры
          • -
          -
        • -
        • Другие -
            -
          • Змеи
          • -
          • Птицы
          • -
          • Ящерицы
          • -
          -
        • -
        -
      • -
      • Рыбы -
          -
        • Аквариумные -
            -
          • Гуппи
          • -
          • Скалярии
          • -
          - -
        • -
        • Морские -
            -
          • Морская форель
          • -
          -
        • -
        -
      • -
      - - - - - - \ No newline at end of file diff --git a/2-ui/1-document/11-modifying-document/8-tree-count/task.md b/2-ui/1-document/11-modifying-document/8-tree-count/task.md deleted file mode 100644 index ac6993b7..00000000 --- a/2-ui/1-document/11-modifying-document/8-tree-count/task.md +++ /dev/null @@ -1,10 +0,0 @@ -# Дерево - -[importance 5] - -Есть дерево [edit src="source"]в песочнице[/edit]. - -Напишите код, который добавит каждому элементу списка `
    • 3
    • 4
    • 5
    • "); -``` - diff --git a/2-ui/1-document/12-multi-insert/1-append-to-list/task.md b/2-ui/1-document/12-multi-insert/1-append-to-list/task.md deleted file mode 100644 index 88c334f6..00000000 --- a/2-ui/1-document/12-multi-insert/1-append-to-list/task.md +++ /dev/null @@ -1,15 +0,0 @@ -# Вставьте элементы в конец списка - -[importance 5] - -Напишите код для вставки текста `html` в конец списка `ul` с использованием метода `insertAdjacentHTML`. Такая вставка, в отличие от присвоения `innerHTML+=`, не будет перезаписывать текущее содержимое. - -Добавьте к списку ниже элементы `
    • 3
    • 4
    • 5
    • `: - -```html -
        -
      • 1
      • -
      • 2
      • -
      -``` - diff --git a/2-ui/1-document/12-multi-insert/2-sort-table-performance/solution.md b/2-ui/1-document/12-multi-insert/2-sort-table-performance/solution.md deleted file mode 100644 index bd110879..00000000 --- a/2-ui/1-document/12-multi-insert/2-sort-table-performance/solution.md +++ /dev/null @@ -1,11 +0,0 @@ -Для сортировки нам поможет функция `sort` массива. - -Общая идея лежит на поверхности: сделать массив из строк и отсортировать его. Тонкости кроются в деталях. - -В ифрейме ниже загружен документ, описывающий и реализующий разные алгоритмы. Обратите внимание: разница в производительности может достигать нескольких раз! - -[iframe height=800 border=1 src="solution" link edit] - -P.S. Создавать `DocumentFragment` здесь ни к чему. Можно вытащить из документа `TBODY` и иметь дело с ним в отрыве от DOM (алгоритм 4). - -P.P.S. Если нужно сделать много узлов, то обычно `innerHTML` работает быстрее, чем удаление и вставка элементов через DOM-вызовы. То есть, сгенерировать таблицу заново эффективнее. diff --git a/2-ui/1-document/12-multi-insert/2-sort-table-performance/solution.view/index.html b/2-ui/1-document/12-multi-insert/2-sort-table-performance/solution.view/index.html deleted file mode 100644 index 9f249c03..00000000 --- a/2-ui/1-document/12-multi-insert/2-sort-table-performance/solution.view/index.html +++ /dev/null @@ -1,202 +0,0 @@ - - - - - -
      - Алгоритм 1. -
        -
      1. Все TR удалить из таблицы, при этом собрав их в JavaScript-массив.
      2. -
      3. Отсортировать этот массив, используя свою функцию в sort(...) для сравнения TR
      4. -
      5. Добавить TR из массива в таблицу в нужном порядке
      6. -
      - -
      - -
      - Алгоритм 2. -
        -
      1. Скопировать TR в JavaScript-массив.
      2. -
      3. Отсортировать этот массив, используя свою функцию в sort(...) для сравнения TR
      4. -
      5. Добавить TR из массива в таблицу в нужном порядке. При добавлении каждый TR сам удалится с предыдущего места.
      6. -
      - -
      - - -
      - Алгоритм 3. -
        -
      1. Создать массив из объектов вида {elem: ссылка на TR, value: содержимое TR}.
      2. -
      3. Отсортировать массив по value. Функция сравнения во время сортировки теперь будет обращаться не к innerHTML, а к свойству объекта, это быстрее. Сортировка может потребовать многократных сравнений одного и того же элемента, - отсюда выигрыш.
      4. -
      5. Добавить TR в таблицу в нужном порядке (автоудалятся с предыдущего места).
      6. -
      - -
      - - -
      - Алгоритм 4. -
        -
      1. Выполнить алгоритм 3, но перед этим удалить таблицу из документа, а после - вставить обратно.
      2. -
      - -
      - -
      - Алгоритм 5. -
        -
      1. Замерить время генерации таблицы (создаётся строка и пишется в innerHTML).
      2. -
      - -
      - -
      - - - - - - -

      Содержимое документа для придания "реалистичности"

      - -
      01234567890123456789012345678901234567890123456789
      -
      01234567890123456789012345678901234567890123456789
      -
      01234567890123456789012345678901234567890123456789
      -
      01234567890123456789012345678901234567890123456789
      -
      01234567890123456789012345678901234567890123456789
      -
      01234567890123456789012345678901234567890123456789
      -
      01234567890123456789012345678901234567890123456789
      -
      01234567890123456789012345678901234567890123456789
      -
      01234567890123456789012345678901234567890123456789
      -
      01234567890123456789012345678901234567890123456789
      -
      01234567890123456789012345678901234567890123456789
      -
      01234567890123456789012345678901234567890123456789
      -
      01234567890123456789012345678901234567890123456789
      -
      01234567890123456789012345678901234567890123456789
      -
      01234567890123456789012345678901234567890123456789
      -
      01234567890123456789012345678901234567890123456789
      -
      01234567890123456789012345678901234567890123456789
      -
      01234567890123456789012345678901234567890123456789
      -
      01234567890123456789012345678901234567890123456789
      -
      01234567890123456789012345678901234567890123456789
      -
      01234567890123456789012345678901234567890123456789
      -
      01234567890123456789012345678901234567890123456789
      -
      01234567890123456789012345678901234567890123456789
      -
      01234567890123456789012345678901234567890123456789
      -
      01234567890123456789012345678901234567890123456789
      -
      01234567890123456789012345678901234567890123456789
      -
      01234567890123456789012345678901234567890123456789
      -
      01234567890123456789012345678901234567890123456789
      -
      01234567890123456789012345678901234567890123456789
      -
      01234567890123456789012345678901234567890123456789
      - - - - - \ No newline at end of file diff --git a/2-ui/1-document/12-multi-insert/2-sort-table-performance/task.md b/2-ui/1-document/12-multi-insert/2-sort-table-performance/task.md deleted file mode 100644 index 600836e0..00000000 --- a/2-ui/1-document/12-multi-insert/2-sort-table-performance/task.md +++ /dev/null @@ -1,48 +0,0 @@ -# Отсортировать таблицу - -[importance 5] - -Есть таблица: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      ИмяФамилияОтчествоВозраст
      ВасяПетровАлександрович10
      ПетяИвановПетрович15
      ВладимирЛенинИльич9
      ............
      - -Строк в таблице много: может быть 20, 50, 100.. Есть и другие элементы в документе. - -Как бы вы предложили отсортировать содержимое таблицы по полю `Возраст`? Обдумайте алгоритм, реализуйте его. - -Как сделать, чтобы сортировка работала как можно быстрее? А если в таблице 10000 строк (бывает и такое)? - -P.S. Может ли здесь помочь `DocumentFragment`? - -P.P.S. Если предположить, что у нас заранее есть массив данных для таблицы в JavaScript -- что быстрее: отсортировать эту таблицу или сгенерировать новую? \ No newline at end of file diff --git a/2-ui/1-document/12-multi-insert/article.md b/2-ui/1-document/12-multi-insert/article.md deleted file mode 100644 index 80c7576e..00000000 --- a/2-ui/1-document/12-multi-insert/article.md +++ /dev/null @@ -1,362 +0,0 @@ -# Мультивставка: insertAdjacentHTML и DocumentFragment - -Обычные методы вставки работают с одним узлом. Но есть и способы вставлять множество узлов одновременно. -[cut] -## Оптимизация вставки в документ - -Рассмотрим задачу: сгенерировать список `UL/LI`. - -Есть две возможных последовательности: - -
        -
      1. Сначала вставить `UL` в документ, а потом добавить к нему `LI`: - -```js -var ul = document.createElement('ul'); -document.body.appendChild(ul); // сначала в документ -for (...) ul.appendChild(li); // потом узлы -``` - -
      2. -
      3. Полностью создать список "вне DOM", а потом -- вставить в документ: - -```js -//+ no-beautify -var ul = document.createElement('ul'); -for(...) ul.appendChild(li); // сначала вставить узлы -document.body.appendChild(ul); // затем в документ -``` - -
      4. -
      - -Как ни странно, между этими последовательностями есть разница. В большинстве браузеров, второй вариант -- быстрее. - -Почему же? Иногда говорят: "потому что браузер перерисовывает каждый раз при добавлении элемента". Это не так. Дело вовсе не в перерисовке. - -Браузер достаточно "умён", чтобы ничего не перерисовывать понапрасну. В большинстве случаев процессы перерисовки и сопутствующие вычисления будут отложены до окончания работы скрипта, и на тот момент уже совершенно без разницы, в какой последовательности были изменены узлы. - -**Тем не менее, при вставке узла происходят разные внутренние события и обновления внутренних структур данных, скрытые от наших глаз.** - -Что именно происходит -- зависит от конкретной, внутренней браузерной реализации DOM, но это отнимает время. Конечно, браузеры развиваются и стараются свести лишние действия к минимуму. - -[online] -### Бенчмарк [#insert-bench-tbody] - -Чтобы легко проверить текущее состояние дел -- вот два бенчмарка. - -Оба они создают таблицу 20x20, наполняя TBODY элементами TR/TD. - -При этом первый вставляет все в документ тут же, второй -- задерживает вставку TBODY в документ до конца процесса. - -Кликните, чтобы запустить. - - - -
      - -Код для тестов находится в файле [insert-bench.js](insert-bench.js). - -[/online] -## Добавление множества узлов - -Продолжим работать со вставкой узлов. - -Рассмотрим случай, когда в документе *уже есть* большой список `UL`. И тут понадобилось срочно добавить еще 20 элементов `LI`. - -Как это сделать? - -Если новые элементы пришли в виде строки, то можно попробовать добавить их так: - -```js -ul.innerHTML += "
    • 1
    • 2
    • ..."; -``` - -Но операцию `ul.innerHTML += "..."` можно по-другому переписать как `ul.innerHTML = ul.innerHTML + "..."`. Иначе говоря, она *не прибавляет, а заменяет* всё содержимое списка на дополненную строку. Это и нехорошо с точки зрения производительности, но и будут побочные эффекты. В частности, все внешние ресурсы (картинки) внутри перезаписываемого `innerHTML` будут загружены заново. Если в каких-то переменных были ссылки на элементы списка -- они станут неверны, так как содержимое полностью заменяется.В общем, так лучше не делать. - -А если нужно вставить в середину списка? Здесь `innerHTML` вообще не поможет. - -Можно, конечно, вставить строку во временный DOM-элемент и перенести оттуда элементы, но есть и гораздо лучший вариант: метод `insertAdjacentHTML`! - -## insertAdjacent* - -Метод [insertAdjacentHTML](https://developer.mozilla.org/en/DOM/element.insertAdjacentHTML) позволяет вставлять произвольный HTML в любое место документа, в том числе *и между узлами*! - -Он поддерживается всеми браузерами, кроме Firefox меньше версии 8, ну а там его можно эмулировать. - -Синтаксис: - -```js -elem.insertAdjacentHTML(where, html); -``` - -
      -
      `html`
      -
      Строка HTML, которую нужно вставить
      -
      `where`
      -
      Куда по отношению к `elem` вставлять строку. Всего четыре варианта: -
        -
      1. `beforeBegin` -- перед `elem`.
      2. -
      3. `afterBegin` -- внутрь `elem`, в самое начало.
      4. -
      5. `beforeEnd` -- внутрь `elem`, в конец.
      6. -
      7. `afterEnd` -- после `elem`.
      8. -
      -
      - - - -Например, вставим пропущенные элементы списка *перед* `
    • 5
    • `: - -```html - -
        -
      • 1
      • -
      • 2
      • -
      • 5
      • -
      - - -``` - -Единственный недостаток этого метода -- он не работает в Firefox до версии 8. Но его можно легко добавить, используя [полифилл insertAdjacentHTML для Firefox](insertAdjacentFF.js). - -У этого метода есть "близнецы-братья", которые поддерживаются везде, кроме Firefox, но в него они добавляются тем же полифиллом: - -
        -
      • [elem.insertAdjacentElement(where, newElem)](http://help.dottoro.com/ljbreokf.php) -- вставляет в произвольное место не строку HTML, а элемент `newElem`.
      • -
      • [elem.insertAdjacentText(where, text)](http://help.dottoro.com/ljrsluxu.php) -- создаёт текстовый узел из строки `text` и вставляет его в указанное место относительно `elem`.
      • -
      - -Синтаксис этих методов, за исключением последнего параметра, полностью совпадает с `insertAdjacentHTML`. Вместе они образуют "универсальный швейцарский нож" для вставки чего угодно куда угодно. - -## DocumentFragment - -[warn header="Важно для старых браузеров"] -Оптимизация, о которой здесь идёт речь, важна в первую очередь для старых браузеров, включая IE9-. В современных браузерах эффект от нее, как правило, небольшой, а иногда может быть и отрицательным. -[/warn] - -До этого мы говорили о вставке строки в DOM. А что делать в случае, когда надо в существующий `UL` вставить много *DOM-элементов*? - -Можно вставлять их один за другим, вызовом `insertBefore/appendChild`, но при этом получится много операций с большим живым документом. - -**Вставить пачку узлов единовременно поможет `DocumentFragment`. Это особенный *кросс-браузерный* DOM-объект, который похож на обычный DOM-узел, но им не является.** - -Синтаксис для его создания: - -```js -var fragment = document.createDocumentFragment(); -``` - -В него можно добавлять другие узлы. - -```js -fragment.appendChild(node); -``` - -Его можно клонировать: - -```js -fragment.cloneNode(true); // клонирование с подэлементами -``` - -**У `DocumentFragment` нет обычных свойств DOM-узлов, таких как `innerHTML`, `tagName` и т.п. Это не узел.** - -Его "Фишка" заключается в том, что когда `DocumentFragment` вставляется в DOM -- то он исчезает, а вместо него вставляются его дети. Это свойство является уникальной особенностью `DocumentFragment`. - -Например, если добавить в него много `LI`, и потом вызвать `ul.appendChild(fragment)`, то фрагмент растворится, и в DOM вставятся именно `LI`, причём в том же порядке, в котором были во фрагменте. - -Псевдокод: - -```js -// хотим вставить в список UL много LI - -// делаем вспомогательный DocumentFragment -var fragment = document.createDocumentFragment(); - -for (цикл по li) { - fragment.appendChild(list[i]); // вставить каждый LI в DocumentFragment -} - -ul.appendChild(fragment); // вместо фрагмента вставятся элементы списка -``` - -В современных браузерах эффект от такой оптимизации может быть различным, а на небольших документах иногда и отрицательным. - -Понять текущее положение вещей вы можете, запустив следующий [edit src="benchmark"]небольшой бенчмарк[/edit]. - -## append/prepend, before/after, replaceWith - -Сравнительно недавно в [стандарте](https://dom.spec.whatwg.org/) появились методы, которые позволяют вставить что угодно и куда угодно. - -Синтаксис: - -
        -
      • `node.append(...nodes)` -- вставляет `nodes` в конец `node`,
      • -
      • `node.prepend(...nodes)` -- вставляет `nodes` в начало `node`,
      • -
      • `node.after(...nodes)` -- вставляет `nodes` после узла `node`,
      • -
      • `node.before(...nodes)` -- вставляет `nodes` перед узлом `node`,
      • -
      • `node.replaceWith(...nodes)` -- вставляет `nodes` вместо `node`.
      • -
      - -Эти методы ничего не возвращают. - -Во всех этих методах `nodes` -- DOM-узлы или строки, в любом сочетании и количестве. Причём строки вставляются именно как текстовые узлы, в отличие от `insertAdjacentHTML`. - - -Пример (с полифиллом): -```html - - - - - - - - - - - - - - -``` - -## Итого - -
        -
      • Манипуляции, меняющие структуру DOM (вставка, удаление элементов), как правило, быстрее с отдельным маленьким узлом, чем с большим DOM, который находится в документе. - -Конкретная разница зависит от внутренней реализации DOM в браузере.
      • -
      • Семейство методов для вставки HTML/элемента/текста в произвольное место документа: -
          -
        • `elem.insertAdjacentHTML(where, html)`
        • -
        • `elem.insertAdjacentElement(where, node)`
        • -
        • `elem.insertAdjacentText(where, text)`
        • -
        - -Два последних метода не поддерживаются в Firefox, на момент написания текста, но есть небольшой полифилл [insertAdjacentFF.js](insertAdjacentFF.js), который добавляет их. Конечно, он нужен только для Firefox. -
      • -
      • `DocumentFragment` позволяет минимизировать количество вставок в большой живой DOM. Эта оптимизация особо эффективна в старых браузерах, в новых эффект от неё меньше или наоборот отрицательный. - -Элементы сначала вставляются в него, а потом -- он вставляется в DOM. При вставке `DocumentFragment` "растворяется", и вместо него вставляются содержащиеся в нём узлы. - -`DocumentFragment`, в отличие от `insertAdjacent*`, работает с коллекцией DOM-узлов. -
      • -
      • Современные методы, работают с любым количеством узлов и текста, желателен полифилл: -
          -
        • `append/prepend` -- вставка в конец/начало.
        • -
        • `before/after` -- вставка после/перед.
        • -
        • `replaceWith` -- замена.
        • -
        -
      • - -
      - - -[head] - - - -[/head] \ No newline at end of file diff --git a/2-ui/1-document/12-multi-insert/benchmark.view/bench.js b/2-ui/1-document/12-multi-insert/benchmark.view/bench.js deleted file mode 100644 index e06acecb..00000000 --- a/2-ui/1-document/12-multi-insert/benchmark.view/bench.js +++ /dev/null @@ -1,11 +0,0 @@ -function bench(test, times) { - var sum = 0; - for (var i = 0; i < times; i++) { - if (test.setup) test.setup(); - var t = new Date(); - test.work(); - sum += (new Date() - t); - if (test.tearDown) test.tearDown(); - } - return sum; -} \ No newline at end of file diff --git a/2-ui/1-document/12-multi-insert/benchmark.view/documentfragment-bench.js b/2-ui/1-document/12-multi-insert/benchmark.view/documentfragment-bench.js deleted file mode 100644 index 8e875cf1..00000000 --- a/2-ui/1-document/12-multi-insert/benchmark.view/documentfragment-bench.js +++ /dev/null @@ -1,45 +0,0 @@ -var DocumentFragmentTest = new function() { - var benchList = document.getElementById('bench-list'); - - var items = []; - for (var i = 0; i < 100; i++) { - var li = document.createElement('li'); - li.innerHTML = i; - items.push(li); - } - - this.insertPlain = new function() { - - this.setup = function() { - while (benchList.firstChild) { - benchList.removeChild(benchList.firstChild); - } - } - - this.work = function() { - for (var i = 0; i < items.length; i++) { - benchList.appendChild(items[i]); - } - } - - }; - - this.insertDocumentFragment = new function() { - - this.setup = function() { - // очистить всё - while (benchList.firstChild) { - benchList.removeChild(benchList.firstChild); - } - } - - this.work = function() { - var docFrag = document.createDocumentFragment(); - for (var i = 0; i < items.length; i++) { - docFrag.appendChild(items[i]); - } - benchList.appendChild(docFrag); - } - - }; -} \ No newline at end of file diff --git a/2-ui/1-document/12-multi-insert/benchmark.view/index.html b/2-ui/1-document/12-multi-insert/benchmark.view/index.html deleted file mode 100644 index 12fecd91..00000000 --- a/2-ui/1-document/12-multi-insert/benchmark.view/index.html +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - - - Вставляются 100 элементов LI в пустой UL. - - - - - -
        - - - - - - - \ No newline at end of file diff --git a/2-ui/1-document/12-multi-insert/documentfragment-bench.js b/2-ui/1-document/12-multi-insert/documentfragment-bench.js deleted file mode 100755 index 8e875cf1..00000000 --- a/2-ui/1-document/12-multi-insert/documentfragment-bench.js +++ /dev/null @@ -1,45 +0,0 @@ -var DocumentFragmentTest = new function() { - var benchList = document.getElementById('bench-list'); - - var items = []; - for (var i = 0; i < 100; i++) { - var li = document.createElement('li'); - li.innerHTML = i; - items.push(li); - } - - this.insertPlain = new function() { - - this.setup = function() { - while (benchList.firstChild) { - benchList.removeChild(benchList.firstChild); - } - } - - this.work = function() { - for (var i = 0; i < items.length; i++) { - benchList.appendChild(items[i]); - } - } - - }; - - this.insertDocumentFragment = new function() { - - this.setup = function() { - // очистить всё - while (benchList.firstChild) { - benchList.removeChild(benchList.firstChild); - } - } - - this.work = function() { - var docFrag = document.createDocumentFragment(); - for (var i = 0; i < items.length; i++) { - docFrag.appendChild(items[i]); - } - benchList.appendChild(docFrag); - } - - }; -} \ No newline at end of file diff --git a/2-ui/1-document/12-multi-insert/insert-bench.js b/2-ui/1-document/12-multi-insert/insert-bench.js deleted file mode 100755 index 95a9c2a6..00000000 --- a/2-ui/1-document/12-multi-insert/insert-bench.js +++ /dev/null @@ -1,59 +0,0 @@ -/* 1. Вставляет TBODY в документ сразу. а затем элементы */ -var appendFirst = new function() { - var benchTable; - - this.setup = function() { - // очистить всё - benchTable = document.getElementById('bench-table') - while (benchTable.firstChild) { - benchTable.removeChild(benchTable.firstChild); - } - } - - this.work = function() { - // встаить TBODY и элементы - var tbody = document.createElement('TBODY'); - benchTable.appendChild(tbody); - - for (var i = 0; i < 20; i++) { - var tr = document.createElement('TR'); - tbody.appendChild(tr); - for (var j = 0; j < 20; j++) { - var td = document.createElement('td'); - td.appendChild(document.createTextNode('' + i.toString(20) + j.toString(20))); - tr.appendChild(td); - } - } - } - -} - -/* 2. Полностью делает TBODY, а затем вставляет в документ */ -var appendLast = new function() { - var benchTable; - - this.setup = function() { - // очистить всё - benchTable = document.getElementById('bench-table'); - while (benchTable.firstChild) { - benchTable.removeChild(benchTable.firstChild); - } - } - - this.work = function() { - var tbody = document.createElement('TBODY'); - - for (var i = 0; i < 20; i++) { - var tr = document.createElement('TR'); - tbody.appendChild(tr); - for (var j = 0; j < 20; j++) { - var td = document.createElement('td'); - tr.appendChild(td); - td.appendChild(document.createTextNode('' + i.toString(20) + j.toString(20))); - } - } - - benchTable.appendChild(tbody); - } - -} \ No newline at end of file diff --git a/2-ui/1-document/12-multi-insert/insertAdjacentFF.js b/2-ui/1-document/12-multi-insert/insertAdjacentFF.js deleted file mode 100644 index 5d619e44..00000000 --- a/2-ui/1-document/12-multi-insert/insertAdjacentFF.js +++ /dev/null @@ -1,35 +0,0 @@ -// http://learn.javascript.ru/files/tutorial/browser/dom/insertAdjacentFF.js -// Добавляет поддержку insertAdjacent* в Firefox - -if (typeof HTMLElement != "undefined" && !HTMLElement.prototype.insertAdjacentElement) { - HTMLElement.prototype.insertAdjacentElement = function(where, parsedNode) { - switch (where) { - case 'beforeBegin': - this.parentNode.insertBefore(parsedNode, this) - break; - case 'afterBegin': - this.insertBefore(parsedNode, this.firstChild); - break; - case 'beforeEnd': - this.appendChild(parsedNode); - break; - case 'afterEnd': - if (this.nextSibling) this.parentNode.insertBefore(parsedNode, this.nextSibling); - else this.parentNode.appendChild(parsedNode); - break; - } - } - - HTMLElement.prototype.insertAdjacentHTML = function(where, htmlStr) { - var r = this.ownerDocument.createRange(); - r.setStartBefore(this); - var parsedHTML = r.createContextualFragment(htmlStr); - this.insertAdjacentElement(where, parsedHTML) - } - - - HTMLElement.prototype.insertAdjacentText = function(where, txtStr) { - var parsedText = document.createTextNode(txtStr) - this.insertAdjacentElement(where, parsedText) - } -} \ No newline at end of file diff --git a/2-ui/1-document/12-multi-insert/insertAdjacentHTML.png b/2-ui/1-document/12-multi-insert/insertAdjacentHTML.png deleted file mode 100755 index e9ac590bc15db0cc7a6c1c02e28057b04a228dda..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2309 zcmX|Ddpy(YAOEtfu(=eaBX^Qp9QP#Tr&Dtqau?PrBJ5D9k-I{Mic!dxNIEpEO~+iO z+)}ebZo^n}spbq>$8daqtJm-Rof`$^&;nL{TX={=En)JzTv{fFPKX0)~Z!2?T;0-?6HmdE3<*&vfCs!dT-134T{dV0F342cA>SS*vtBoIJjV=y!n zlkw^t1l4ydC z4vK{!4*+(lBAkwUU!PbC4oKu!%NeRw>Wue5kKVd(Ag2`f&fSzu13}VKhLIYIj#zeG zjUI(m>Uc&!yBNUfrV~<~WfG}+pSdcov|tiq?@^OL2M$r|ed3PJ&qAk!k2aNpkN5nY zoJNil&}5qkgT=uue?IFs&Uz$b;vE`-yh!t_5?Aj#6=V^eq3F36$enU5^vNp(yp3dh ztMGxSN5e9}a6CeP9ku&hv4*s7sk!o43~_H-pjhNh>tJr~K6zr3dY=O7v!R?qS?v1| z|A;dKy^;HOyfysI&{u!KMZ8T^c}XvGmwuC>bORc~f=`ME<=q#j_xE$M^`K~HRJ9oK zUR-&xJ|jJ{y~(wcOM1cBv@7Zwbgr$^&efaOS({u!$nB7quk~VW;WIzfAJ7$h>Z2Hx zKx342zjF8xHltjqM3yo=enZyw(v0tDyrPhnDXvbe8l+mXy?n}-iUNrlX&A&{*i1g$ zHi9@IHaF1Z@hb%|sDEMpNn5UFGqBveIY$?M!{r_X@@Su27qr5PXEj<>A<8r@U5 zi{;lS+VeQQv8NS0T``_sm`=NXUD3rif=-l)5)KrD5-RR=LYvZ})Rp^Cko`YEw1Zjx z|8QNYy{)ws77`NDo)qZVgWXbsK{GlFkgk2!x%>=Km-X!&$^9h;^Sw0(&!4Hg&nJ}L ziLFH^--vVUxp`Z-{YG;C!V0rS_q>T+wnx9`c8vKKGp2Qywe8~N1x&vhJS%y7;BOj( zhARu5!Y2Ci9!ll4oob)`!iM*%xxIe$3TV7`s0ev2 zcXmYyI6yMq*%oVNtjeb?6s#ubWhP$-QfZ7gEiD&O16ds@?K#b%-P3g*=JoJ0N0m)s zR&|lrt<-XtAe+?7n9aiguBu4ml|0awld~WXAT?p~8}ZpDT^GeAagKBqpJ@C(GrsHg z!3sj8W0?;Btcu0k&kIW%Pb^8RPyP4M4c)HpTf5HJsCUOssO(bLkY*#@UuTs!`n1%q%ZgN1Q$g02hGe+h zW~eguC1x5FDA1^mUYxEu`pQ&kn(EB>aukaiEom*p^a$o$UwwClF|W;=(J9f`-?4wS z8C@ed)xX zyd4~*p<7y^RI#p63LQwgP8AB>FGF+=u*k>uK*-C}5@$w_zHCiQ;q^Z=`j)R*{x&r9 zIDz24>lle$Z`sUn!{rpf424_aq8IXeFB&`-OD$9$^X6?x<%JbeXMeZsO-nNs-|DSQ z2tG#)FNkJ#(LW8VLY^P}uF`w$*;}&OZ2vP0tV+scGWNtabZZn__Wr|H(ng(t&2Tp2 zXhGoYsf|ZdbjbAX1w~qk%na~2!Y+>JFDrG^4hT?aiO@|>zFVEvUXIwgy!D{GMQF~7 z4`x-|Y!FSKZzT5eFgMCF{nAGDyFFziTzGD-4IV^oHbYGei%$&=jJo|{^>uW1$ju_8 z%LqDu!}BalXL>@9Q;r@OE+I=+@#olU4vlsSzcl|vDSdRzs%8(f3>bvmR`VVR>B*1w zwIjLCv@D%G3y@E19$CuzHgazLY;TyEy|R_ieK)z`KTI57&4nXX1E=h_bvaWE4B}gj;=RI{Azq(YhGK%+_CJ-AxC3k`yItGrF+DV+ zLxist-VmEjKNpsH?)^7WM1)=#)U|r-tDS^L5GHX6ch^oIOo}s$RJ!3A1O2HjQR*4+ z^N?`|%R3_YS8)C(KR={Jq)V`##6~xSE`NP8=5N}nQ9N%jVn;%OI;a5={$}6k2m?wrI`2|xct|4nskZ?Il8$>Jfocp| z+<5)kEu}%Tepp<(IvyZWUA#I4tNY0?Ov7N+IQ^Wqq&TJD&rq`qO;OMk8 - - 1 - - 3 - -``` - -**Нет никаких ограничений на содержимое `document.write`**. - -Строка просто пишется в HTML-документ без проверки структуры тегов, как будто она всегда там была. - -Например: - -```html - - - - - - Текст внутри TD. - - -
        -``` - -Также существует метод `document.writeln(str)` -- не менее древний, который добавляет после `str` символ перевода строки `"\n"`. - -## Только до конца загрузки - -Во время загрузки браузер читает документ и тут же строит из него DOM, по мере получения информации достраивая новые и новые узлы, и тут же отображая их. Этот процесс идет непрерывным потоком. Вы наверняка видели это, когда заходили на сайты в качестве посетителя -- браузер зачастую отображает неполный документ, добавляя его новыми узлами по мере их получения. - -**Методы `document.write` и `document.writeln` пишут напрямую в текст документа, до того как браузер построит из него DOM, поэтому они могут записать в документ все, что угодно, любые стили и незакрытые теги.** - -Браузер учтёт их при построении DOM, точно так же, как учитывает очередную порцию HTML-текста. - -Технически, вызвать `document.write` можно в любое время, однако, когда HTML загрузился, и браузер полностью построил DOM, документ становится *"закрытым"*. Попытка дописать что-то в закрытый документ открывает его заново. При этом все текущее содержимое удаляется. - -Текущая страница, скорее всего, уже загрузилась, поэтому если вы нажмёте на эту кнопку -- её содержимое удалится: - -[pre no-typography] - -[/pre] - -Из-за этой особенности `document.write` для загруженных документов не используют. - -[warn header="XHTML и `document.write`"] -В некоторых современных браузерах при получении страницы с заголовком `Content-Type: text/xml` или `Content-Type: text/xhtml+xml` включается "XML-режим" чтения документа. Метод `document.write` при этом не работает. - -Это лишь одна из причин, по которой XML-режим обычно не используют. -[/warn] - - -## Преимущества перед innerHTML - -Метод `document.write` -- динозавр, он существовал десятки миллионов лет назад. С тех пор, как появился и стал стандартным метод `innerHTML`, нужда в нём возникает редко, но некоторые преимущества, всё же, есть. - -
          -
        • Метод `document.write` работает быстрее, фактически это самый быстрый способ добавить на страницу текст, сгенерированный скриптом. - -Это естественно, ведь он не модифицирует существующий DOM, а пишет в текст страницы до его генерации.
        • -
        • Метод `document.write` вставляет любой текст на страницу "как есть", в то время как `innerHTML` может вписать лишь валидный HTML (при попытке подсунуть невалидный -- браузер скорректирует его).
        • -
        - -Эти преимущества являются скорее средством оптимизации, которое нужно использовать именно там, где подобная оптимизация нужна или уместна. - -Однако, `document.write` по своей природе уникален: он добавляет текст "в текущее место документа", без всяких хитроумных DOM. Поэтому он бывает просто-напросто удобен, из-за чего его нередко используют не по назначению. - -## Антипример: реклама - -Например, `document.write` используют для вставки рекламных скриптов и различных счетчиков, когда URL скрипта необходимо генерировать динамически, добавляя в него параметры из JavaScript, например: - -```html - -``` - -[smart] -Закрывающий тег </script> в строке разделён, чтобы браузер не увидел `` и не посчитал его концом скрипта. - -Также используют запись: - -```js -document.write('`: обратный слеш `\` обычно используется для вставки спецсимволов типа `\n`, а если такого спецсимвола нет, в данном случае `\/` не является спецсимволом, то будет проигнорирован. Так что получается такой альтернативный способ безопасно вставить строку ``. -[/smart] - -Сервер, получив запрос с такими параметрами, обрабатывает его и, учитывая переданную информацию, генерирует текст скрипта, в котором обычно есть какой-то другой `document.write`, рисующий на этом месте баннер. - -**Проблема здесь в том, что загрузка такого скрипта блокирует отрисовку всей страницы.** - -То есть, дело даже не в самом `document.write`, а в том, что в страницу вставляется сторонний скрипт, а браузер устроен так, что пока он его не загрузит и не выполнит -- он не будет дальше строить DOM и показывать документ. - -Представим на минуту, что сервер `ads.com`, с которого грузится скрипт, работает медленно или вообще завис -- зависнет и наша страница. - -Что делать? - -В современных браузерах у скриптов есть атрибуты `async` и `defer`, которые разрешают браузеру продолжать обработку страницы, но применить их здесь нельзя, так как рекламный скрипт захочет вызвать `document.write` именно на этом месте, и браузер не должен двигаться вперёд по документу. - -Альтернатива -- использовать другие техники вставки рекламы и счётчиков. Примеры вы можете увидеть в коде Google Analytics, Яндекс.Метрики и других. - -Если это невозможно -- применяют всякие хитрые оптимизации, например заменяют метод `document.write` своей функцией, и она уже разбирается со скриптами и баннерами. - -## Итого - -Метод `document.write` (или `writeln`) пишет текст прямо в HTML, как будто он там всегда был. - -
          -
        • Этот метод редко используется, так как работает только из скриптов, выполняемых в процессе загрузки страницы. - -Запуск после загрузки приведёт к очистке документа.
        • -
        • Метод `document.write` очень быстр. - -В отличие от установки `innerHTML` и DOM-методов, он не изменяет существующий документ, а работает на стадии текста, до того как DOM-структура сформирована.
        • -
        • Иногда `document.write` используют для добавления скриптов с динамическим URL. - -Рекомендуется избегать этого, так как браузер остановится на месте добавления скрипта и будет ждать его загрузки. Если скрипт будет тормозить, то и страница -- тоже. - -Поэтому желательно подключать внешние скрипты, используя вставку скрипта через DOM или `async/defer`. Современные системы рекламы и статистики так и делают. -
        • -
        diff --git a/2-ui/1-document/14-styles-and-classes/1-round-button-javascript/solution.md b/2-ui/1-document/14-styles-and-classes/1-round-button-javascript/solution.md deleted file mode 100644 index c78f0136..00000000 --- a/2-ui/1-document/14-styles-and-classes/1-round-button-javascript/solution.md +++ /dev/null @@ -1,43 +0,0 @@ -Есть два варианта. - -
          -
        1. Можно использовать свойство `elem.style.cssText` и присвоить стиль в текстовом виде. При этом все присвоенные ранее свойства `elem.style` будут удалены.
        2. -
        3. Можно назначить подсвойства `elem.style` одно за другим. Этот способ более безопасен, т.к. меняет только явно присваемые свойства.
        4. -
        - -Мы выберем второй путь. - -[edit src="solution"]Открыть решение[/edit] - -**Описание CSS-свойств:** - -```css -.button { - -moz-border-radius: 8px; - -webkit-border-radius: 8px; - border-radius: 8px; - border: 2px groove green; - display: block; - height: 30px; - line-height: 30px; - width: 100px; - text-decoration: none; - text-align: center; - color: red; - font-weight: bold; -} -``` - -
        -
        `*-border-radius`
        -
        Добавляет скругленные углы. Свойство присваивается в вариантах для Firefox `-moz-...`, Chrome/Safari `-webkit-...` и стандартное CSS3-свойство для тех, кто его поддерживает (Opera).
        -
        `display`
        -
        По умолчанию, у `A` это свойство имеет значение `display: inline`.
        -
        `height`, `line-height`
        -
        Устанавливает высоту и делает текст вертикально центрированным путем установки `line-height` в значение, равное высоте. Такой способ центрирования текста работает, если он состоит из одной строки.
        -
        `text-align`
        -
        Центрирует текст горизонтально.
        -
        `color`, `font-weight`
        -
        Делает текст красным и жирным.
        -
        - diff --git a/2-ui/1-document/14-styles-and-classes/1-round-button-javascript/solution.view/index.html b/2-ui/1-document/14-styles-and-classes/1-round-button-javascript/solution.view/index.html deleted file mode 100755 index bf487e59..00000000 --- a/2-ui/1-document/14-styles-and-classes/1-round-button-javascript/solution.view/index.html +++ /dev/null @@ -1,40 +0,0 @@ - - - - - - - - - -
        - Кнопка: - -
        - - - - - - - \ No newline at end of file diff --git a/2-ui/1-document/14-styles-and-classes/1-round-button-javascript/source.view/index.html b/2-ui/1-document/14-styles-and-classes/1-round-button-javascript/source.view/index.html deleted file mode 100755 index 3492198b..00000000 --- a/2-ui/1-document/14-styles-and-classes/1-round-button-javascript/source.view/index.html +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - -
        - Кнопка: - -
        - - - - - - - \ No newline at end of file diff --git a/2-ui/1-document/14-styles-and-classes/1-round-button-javascript/task.md b/2-ui/1-document/14-styles-and-classes/1-round-button-javascript/task.md deleted file mode 100644 index 78da0a79..00000000 --- a/2-ui/1-document/14-styles-and-classes/1-round-button-javascript/task.md +++ /dev/null @@ -1,33 +0,0 @@ -# Скругленая кнопка со стилями из JavaScript - -[importance 3] - -Создайте кнопку в виде элемента `` с заданным стилем, используя JavaScript. - -В примере ниже такая кнопка создана при помощи HTML/CSS. В вашем решении кнопка должна создаваться, настраиваться и добавляться в документ при помощи *только JavaScript*, без тегов ` - -Нажми меня -``` - -**Проверьте себя: вспомните, что означает каждое свойство. В чём состоит эффект его появления здесь?** - - diff --git a/2-ui/1-document/14-styles-and-classes/2-create-notification/solution.md b/2-ui/1-document/14-styles-and-classes/2-create-notification/solution.md deleted file mode 100644 index e69de29b..00000000 diff --git a/2-ui/1-document/14-styles-and-classes/2-create-notification/solution.view/index.css b/2-ui/1-document/14-styles-and-classes/2-create-notification/solution.view/index.css deleted file mode 100755 index b21a80be..00000000 --- a/2-ui/1-document/14-styles-and-classes/2-create-notification/solution.view/index.css +++ /dev/null @@ -1,14 +0,0 @@ -.notification { - position: fixed; - z-index: 1000; - padding: 5px; - border: 1px solid black; - font: normal 20px Georgia; - background: white; - text-align: center; -} - -.welcome { - background: red; - color: yellow; -} \ No newline at end of file diff --git a/2-ui/1-document/14-styles-and-classes/2-create-notification/solution.view/index.html b/2-ui/1-document/14-styles-and-classes/2-create-notification/solution.view/index.html deleted file mode 100755 index 07ba7a03..00000000 --- a/2-ui/1-document/14-styles-and-classes/2-create-notification/solution.view/index.html +++ /dev/null @@ -1,65 +0,0 @@ - - - - - - - - - - -

        Уведомление

        - -

        - Lorem ipsum dolor sit amet, consectetur adipisicing elit. Dolorum aspernatur quam ex eaque inventore quod voluptatem adipisci omnis nemo nulla fugit iste numquam ducimus cumque minima porro ea quidem maxime necessitatibus beatae labore soluta voluptatum - magnam consequatur sit laboriosam velit excepturi laborum sequi eos placeat et quia deleniti? Corrupti velit impedit autem et obcaecati fuga debitis nemo ratione iste veniam amet dicta hic ipsam unde cupiditate incidunt aut iure ipsum officiis soluta - temporibus. Tempore dicta ullam delectus numquam consectetur quisquam explicabo culpa excepturi placeat quo sequi molestias reprehenderit hic at nemo cumque voluptates quidem repellendus maiores unde earum molestiae ad. -

        - - - - - - - \ No newline at end of file diff --git a/2-ui/1-document/14-styles-and-classes/2-create-notification/source.view/index.css b/2-ui/1-document/14-styles-and-classes/2-create-notification/source.view/index.css deleted file mode 100755 index b21a80be..00000000 --- a/2-ui/1-document/14-styles-and-classes/2-create-notification/source.view/index.css +++ /dev/null @@ -1,14 +0,0 @@ -.notification { - position: fixed; - z-index: 1000; - padding: 5px; - border: 1px solid black; - font: normal 20px Georgia; - background: white; - text-align: center; -} - -.welcome { - background: red; - color: yellow; -} \ No newline at end of file diff --git a/2-ui/1-document/14-styles-and-classes/2-create-notification/source.view/index.html b/2-ui/1-document/14-styles-and-classes/2-create-notification/source.view/index.html deleted file mode 100755 index dd184fce..00000000 --- a/2-ui/1-document/14-styles-and-classes/2-create-notification/source.view/index.html +++ /dev/null @@ -1,50 +0,0 @@ - - - - - - - - - - -

        Уведомление

        - -

        - Lorem ipsum dolor sit amet, consectetur adipisicing elit. Dolorum aspernatur quam ex eaque inventore quod voluptatem adipisci omnis nemo nulla fugit iste numquam ducimus cumque minima porro ea quidem maxime necessitatibus beatae labore soluta voluptatum - magnam consequatur sit laboriosam velit excepturi laborum sequi eos placeat et quia deleniti? Corrupti velit impedit autem et obcaecati fuga debitis nemo ratione iste veniam amet dicta hic ipsam unde cupiditate incidunt aut iure ipsum officiis soluta - temporibus. Tempore dicta ullam delectus numquam consectetur quisquam explicabo culpa excepturi placeat quo sequi molestias reprehenderit hic at nemo cumque voluptates quidem repellendus maiores unde earum molestiae ad. -

        - -

        В CSS есть готовый класс notification, который можно ставить уведомлению.

        - - - - - - - \ No newline at end of file diff --git a/2-ui/1-document/14-styles-and-classes/2-create-notification/task.md b/2-ui/1-document/14-styles-and-classes/2-create-notification/task.md deleted file mode 100644 index bc89ddcc..00000000 --- a/2-ui/1-document/14-styles-and-classes/2-create-notification/task.md +++ /dev/null @@ -1,41 +0,0 @@ -# Создать уведомление - -[importance 5] - -Напишите функцию `showNotification(options)`, которая показывает уведомление, пропадающее через 1.5 сек. - -Описание функции: - -```js -/** - * Показывает уведомление, пропадающее через 1.5 сек - * - * @param options.top {number} вертикальный отступ, в px - * @param options.right {number} правый отступ, в px - * @param options.cssText {string} строка стиля - * @param options.className {string} CSS-класс - * @param options.html {string} HTML-текст для показа - */ -function showNotification(options) { - // ваш код -} -``` - -Пример использования: - -```js -// покажет элемент с текстом "Привет" и классом welcome справа-сверху окна -showNotification({ - top: 10, - right: 10, - html: "Привет", - className: "welcome" -}); -``` - -[demo src="solution"] - -Элемент уведомления должен иметь CSS-класс `notification`, к которому добавляется класс из `options.className`, если есть. Исходный документ содержит готовые стили. - - - diff --git a/2-ui/1-document/14-styles-and-classes/article.md b/2-ui/1-document/14-styles-and-classes/article.md deleted file mode 100644 index ad9b8893..00000000 --- a/2-ui/1-document/14-styles-and-classes/article.md +++ /dev/null @@ -1,319 +0,0 @@ -# Стили, getComputedStyle - -Эта глава -- о свойствах стиля, получении о них информации и изменении при помощи JavaScript. - -Перед прочтением убедитесь, что хорошо знакомы с [блочной моделью CSS](http://www.w3.org/TR/CSS2/box.html) и понимаете, что такое `padding`, `margin`, `border`. - -[cut] - -## Стили элемента: свойство style - -Объект `element.style` дает доступ к стилю элемента на чтение и запись. - -С его помощью можно изменять большинство CSS-свойств, например `element.style.width="100px"` работает так, как будто у элемента в атрибуте прописано `style="width:100px"`. - -[warn header="Единицы измерения обязательны в `style`"] -Об этом иногда забывают, но в `style` так же, как и в CSS, нужно указывать единицы измерения, например `px`. - -Ни в коем случае не просто `elem.style.width = 100` -- работать не будет. -[/warn] - -**Для свойств, названия которых состоят из нескольких слов, используется вотТакаяЗапись:** - -```js -//+ no-beautify -background-color => elem.style.backgroundColor -z-index => elem.style.zIndex -border-left-width => elem.style.borderLeftWidth -``` - -Пример использования `style`: - -```js -//+ run -document.body.style.backgroundColor = prompt('background color?', 'green'); -``` - -[warn header="`style.cssFloat` вместо `style.float`"] -Исключением является свойство `float`. В старом стандарте JavaScript слово `"float"` было зарезервировано и недоступно для использования в качестве свойства объекта. Поэтому используется не `elem.style.float`, а `elem.style.cssFloat`. -[/warn] - -[smart header="Свойства с префиксами"] -Специфические свойства браузеров, типа `-moz-border-radius`, `-webkit-border-radius`, записываются следующим способом: - -```js -button.style.MozBorderRadius = '5px'; -button.style.WebkitBorderRadius = '5px'; -``` - -То есть, каждый дефис даёт большую букву. -[/smart] - -**Чтобы сбросить поставленный стиль, присваивают в `style` пустую строку: `elem.style.width=""`.** - -При сбросе свойства `style` стиль будет взят из CSS. - -Например, для того, чтобы спрятать элемент, можно присвоить: `elem.style.display = "none"`. - -А вот чтобы показать его обратно -- не обязательно явно указывать другой `display`, наподобие `elem.style.display = "block"`. Можно просто снять поставленный стиль: `elem.style.display = ""`. - -```js -//+ run -// если запустить этот код, то "мигнёт" -document.body.style.display = "none"; - -setTimeout(function() { - document.body.style.display = ""; -}, 1000); -``` - -**Стиль в `style` находится в формате браузера, а не в том, в котором его присвоили.** - -Например: - -```html - - - - -``` - -Обратите внимание на то, как браузер "распаковал" свойство `style.margin`, предоставив для чтения `style.marginTop`. То же самое произойдет и для `border`, `background` и т.д. - - -[warn header="Свойство `style` мы используем лишь там, где не работают классы"] -В большинстве случаев внешний вид элементов задаётся классами. А JavaScript добавляет или удаляет их. Такой код красив и гибок, дизайн можно легко изменять. - -Свойство `style` нужно использовать лишь там, где классы не подходят, например если точное значение цвета/отступа/высоты вычисляется в JavaScript. -[/warn] - - -### Строка стилей style.cssText - -Свойство `style` является специальным объектом, ему нельзя присваивать строку. - -Запись `div.style="color:blue"` работать не будет. Но как же, всё-таки, поставить свойство стиля, если хочется задать его строкой? - -Можно попробовать использовать атрибут: `elem.setAttribute("style", ...)`, но самым правильным и, главное, кросс-браузерным (с учётом старых IE) решением такой задачи будет использование свойства `style.cssText`. - -**Свойство `style.cssText` позволяет поставить стиль целиком в виде строки.** - -Например: - -```html - -
        Button
        - - -``` - -Браузер разбирает строку `style.cssText` и применяет известные ему свойства. Неизвестные, наподобие `blabla`, большинство браузеров просто проигнорируют. - -**При установке `style.cssText` все предыдущие свойства `style` удаляются.** - -Итак, `style.cssText` осуществляет полную перезапись `style`. Если же нужно заменить какое-то конкретно свойство стиля, то обращаются именно к нему: `style.color`, `style.width` и т.п, чтобы не затереть что-то важное по ошибке. - -Свойство `style.cssText` используют, например, для новосозданных элементов, когда старых стилей точно нет. - -### Чтение стиля из style - -Записать в стиль очень просто. А как прочитать? - -Например, мы хотим узнать размер, отступы элемента, его цвет... Как это сделать? - -**Свойство `style` содержит лишь тот стиль, который указан в атрибуте элемента, без учёта каскада CSS.** - -Вот так `style` уже ничего не увидит: - -```html - - - - - - - Красный текст - - -``` - -## Полный стиль из getComputedStyle - -Итак, свойство `style` дает доступ только к той информации, которая хранится в `elem.style`. - -Он не скажет ничего об отступе, если он появился в результате наложения CSS или встроенных стилей браузера: - -А если мы хотим, например, сделать анимацию и плавно увеличивать `marginTop` от текущего значения? Как нам сделать это? Ведь для начала нам надо это текущее значение получить. - -**Для того, чтобы получить текущее используемое значение свойства, используется метод `window.getComputedStyle`, описанный в стандарте DOM Level 2.** - -Его синтаксис таков: - -```js -getComputedStyle(element[, pseudo]) -``` - -
        -
        element
        -
        Элемент, значения для которого нужно получить
        -
        pseudo
        -
        Указывается, если нужен стиль псевдо-элемента, например `"::before"`. Пустая строка или отсутствие аргумента означают сам элемент.
        -
        - -Поддерживается всеми браузерами, кроме IE8-. Следующий код будет работать во всех не-IE браузерах и в IE9+: - -```html - - - - - - - - -``` - -[smart header="Вычисленное (computed) и окончательное (resolved) значения"] -В CSS есть две концепции: -
          -
        1. *Вычисленное* (computed) значение -- это то, которое получено после применения всех правил CSS и CSS-наследования. Например, `width: auto` или `font-size: 125%`.
        2. -
        3. *Окончательное* ([resolved](http://dev.w3.org/csswg/cssom/#resolved-values)) значение -- непосредственно применяемое к элементу. При этом все размеры приводятся к пикселям, например `width: 212px` или `font-size: 16px`. В некоторых браузерах пиксели могут быть дробными.
        4. -
        -Когда-то `getComputedStyle` задумывалось для возврата вычисленного значения, но со временем оказалось, что окончательное гораздо удобнее. - -Поэтому сейчас в целом все значения возвращаются именно окончательные, кроме некоторых небольших глюков в браузерах, которые постепенно вычищаются. -[/smart] - -[warn header="`getComputedStyle` требует полное свойство!"] -Для правильного получения значения нужно указать точное свойство. Например: `paddingLeft`, `marginTop`, `borderLeftWidth`. - -**При обращении к сокращенному: `padding`, `margin`, `border` -- правильный результат не гарантируется.** - -Действительно, допустим свойства `paddingLeft/paddingTop` взяты из разных классов CSS. Браузер не обязан объединять их в одно свойство `padding`. Иногда, в простейших случаях, когда свойство задано сразу целиком, `getComputedStyle` сработает для сокращённого свойства, но не во всех браузерах. - -Например, некоторые браузеры (Chrome) выведут `10px` в документе ниже, а некоторые (Firefox) -- нет: - -```html - - - -``` - -[/warn] - - -[smart header="Стили посещенных ссылок -- тайна!"] -У посещенных ссылок может быть другой цвет, фон, чем у обычных. Это можно поставить в CSS с помощью псевдокласса `:visited`. - -Но `getComputedStyle` не дает доступ к этой информации, чтобы произвольная страница не могла определить, посещал ли пользователь ту или иную ссылку. - -Кроме того, большинство браузеров запрещают применять к `:visited` CSS-стили, которые могут изменить геометрию элемента, чтобы даже окольным путем нельзя было это понять. В целях безопасности. -[/smart] - -## currentStyle для IE8- - -В IE8- нет `getComputedStyle`, но у элементов есть свойство currentStyle, которое возвращает вычисленное (computed) значение: уже с учётом CSS-каскада, но не всегда в окончательном формате. - -Чтобы код работал и в старых и новых браузерах, обычно пишут кросс-браузерный код, наподобие такого: - -```js -function getStyle(elem) { - return window.getComputedStyle ? getComputedStyle(elem, "") : elem.currentStyle; -} -``` - -Если вы откроете такой документ в IE8-, то размеры будут в процентах, а в современных браузерах -- в пикселях. - -```html - - - - - - -``` - -[smart header="IE8-: перевод `pt,em,%` из `currentStyle` в пиксели"] -Эта информация -- дополнительная, она не обязательна для освоения. - -В IE для того, чтобы получить из процентов реальное значение в пикселях существует метод "runtimeStyle+pixel", [описанный Дином Эдвардсом](http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291). - -Он основан на свойствах `runtimeStyle` и `pixelLeft`, работающих только в IE. - -В [edit src="getiecomputedstyle"]песочнице[/edit] вы можете найти функцию `getIEComputedStyle(elem, prop)`, которая получает значение в пикселях для свойства `prop`, используя `elem.currentStyle` и метод Дина Эдвардса, и пример её применения. - -Если вам интересно, как он работает, ознакомьтесь со свойствами с runtimeStyle и pixelLeft в MSDN и раскройте код. - -Конечно, это актуально только для IE8- и полифиллов. -[/smart] - - -## Итого - -Все DOM-элементы предоставляют следующие свойства. - -
          -
        • Свойство `style` -- это объект, в котором CSS-свойства пишутся `вотТакВот`. Чтение и изменение его свойств -- это, по сути, работа с компонентами атрибута `style`.
        • -
        • `style.cssText` -- строка стилей для чтения или записи. Аналог полного атрибута `style`.
        • - -
        • Свойство `currentStyle`(IE8-) и метод `getComputedStyle` (IE9+, стандарт) позволяют получить реальное, применённое сейчас к элементу свойство стиля с учётом CSS-каскада и браузерных стилей по умолчанию. - -При этом `currentStyle` возвращает значение из CSS, до окончательных вычислений, а `getComputedStyle` -- окончательное, непосредственно применённое к элементу (как правило).
        • -
        - -Более полная информация о свойстве `style`, включающая другие, реже используемые методы работы с ним, доступна [в документации](https://developer.mozilla.org/en-US/docs/DOM/CSSStyleDeclaration). - diff --git a/2-ui/1-document/14-styles-and-classes/getiecomputedstyle.view/getiecomputedstyle.js b/2-ui/1-document/14-styles-and-classes/getiecomputedstyle.view/getiecomputedstyle.js deleted file mode 100644 index 12a7e04c..00000000 --- a/2-ui/1-document/14-styles-and-classes/getiecomputedstyle.view/getiecomputedstyle.js +++ /dev/null @@ -1,18 +0,0 @@ -function getIEComputedStyle(elem, prop) { - var value = elem.currentStyle[prop] || 0; - - // we use 'left' property as a place holder so backup values - var leftCopy = elem.style.left; - var runtimeLeftCopy = elem.runtimeStyle.left; - - // assign to runtimeStyle and get pixel value - elem.runtimeStyle.left = elem.currentStyle.left; - elem.style.left = (prop === "fontSize") ? "1em" : value; - value = elem.style.pixelLeft + "px"; - - // restore values for left - elem.style.left = leftCopy; - elem.runtimeStyle.left = runtimeLeftCopy; - - return value; -} \ No newline at end of file diff --git a/2-ui/1-document/14-styles-and-classes/getiecomputedstyle.view/index.html b/2-ui/1-document/14-styles-and-classes/getiecomputedstyle.view/index.html deleted file mode 100644 index a757f39f..00000000 --- a/2-ui/1-document/14-styles-and-classes/getiecomputedstyle.view/index.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - - -
        Тестовый элемент с margin 1%
        - - - - - \ No newline at end of file diff --git a/2-ui/1-document/15-metrics/1-get-scroll-height-bottom/solution.md b/2-ui/1-document/15-metrics/1-get-scroll-height-bottom/solution.md deleted file mode 100644 index 4d84cf8f..00000000 --- a/2-ui/1-document/15-metrics/1-get-scroll-height-bottom/solution.md +++ /dev/null @@ -1 +0,0 @@ -Решение: `elem.scrollHeight - elem.scrollTop - elem.clientHeight`. \ No newline at end of file diff --git a/2-ui/1-document/15-metrics/1-get-scroll-height-bottom/task.md b/2-ui/1-document/15-metrics/1-get-scroll-height-bottom/task.md deleted file mode 100644 index d2684e18..00000000 --- a/2-ui/1-document/15-metrics/1-get-scroll-height-bottom/task.md +++ /dev/null @@ -1,9 +0,0 @@ -# Найти размер прокрутки снизу - -[importance 5] - -Свойство `elem.scrollTop` содержит размер прокрученной области при отсчете сверху. А как подсчитать размер прокрутки снизу? - -Напишите соответствующее выражение для произвольного элемента `elem`. - -Проверьте: если прокрутки нет вообще или элемент полностью прокручен -- оно должно давать ноль. \ No newline at end of file diff --git a/2-ui/1-document/15-metrics/2-scrollbar-width/solution.md b/2-ui/1-document/15-metrics/2-scrollbar-width/solution.md deleted file mode 100644 index 9cb7a82d..00000000 --- a/2-ui/1-document/15-metrics/2-scrollbar-width/solution.md +++ /dev/null @@ -1,23 +0,0 @@ -Создадим элемент с прокруткой, но без `border` и `padding`. Тогда разница между его полной шириной `offsetWidth` и внутренней `clientWidth` будет равна как раз прокрутке: - -```js -//+ run -// создадим элемент с прокруткой -var div = document.createElement('div'); - -div.style.overflowY = 'scroll'; -div.style.width = '50px'; -div.style.height = '50px'; - -// при display:none размеры нельзя узнать -// нужно, чтобы элемент был видим, -// visibility:hidden - можно, т.к. сохраняет геометрию -div.style.visibility = 'hidden'; - -document.body.appendChild(div); -var scrollWidth = div.offsetWidth - div.clientWidth; -document.body.removeChild(div); - -alert( scrollWidth ); -``` - diff --git a/2-ui/1-document/15-metrics/2-scrollbar-width/task.md b/2-ui/1-document/15-metrics/2-scrollbar-width/task.md deleted file mode 100644 index 77867ac8..00000000 --- a/2-ui/1-document/15-metrics/2-scrollbar-width/task.md +++ /dev/null @@ -1,7 +0,0 @@ -# Узнать ширину полосы прокрутки - -[importance 3] - -Напишите код, который возвращает ширину стандартной полосы прокрутки. Именно самой полосы, где ползунок. Обычно она равна `16px`, в редких и мобильных браузерах может колебаться от `14px` до `18px`, а кое-где даже равна `0px`. - -P.S. Ваш код должен работать на любом HTML-документе, независимо от его содержимого. \ No newline at end of file diff --git a/2-ui/1-document/15-metrics/3-div-placeholder/solution.md b/2-ui/1-document/15-metrics/3-div-placeholder/solution.md deleted file mode 100644 index aa685293..00000000 --- a/2-ui/1-document/15-metrics/3-div-placeholder/solution.md +++ /dev/null @@ -1,29 +0,0 @@ -Нам нужно создать `div` с такими же размерами и вставить его на место "переезжающего". - -Один из вариантов -- это просто клонировать элемент. - -Если делать это при помощи `div.cloneNode(true)`, то склонируется все содержимое, которого может быть много. Обычно нам это не нужно, поэтому можно использовать `div.cloneNode(false)` для клонирования элемента со стилями, и потом поправить его `width/height`. - -Можно и просто создать новый `div` и поставить ему нужные размеры. - -**Всё, кроме `margin`, можно получить из свойств DOM-элемента, а `margin` -- только через `getComputedStyle`.** - -Причём `margin` мы обязаны поставить, так как иначе наш элемент при вставке будет вести себя иначе, чем исходный. - -Код: - -```js -var div = document.getElementById('moving-div'); - -var placeHolder = document.createElement('div'); -placeHolder.style.height = div.offsetHeight + 'px'; -// можно и width, но в этом примере это не обязательно - -// IE || другой браузер -var computedStyle = div.currentStyle || getComputedStyle(div, ''); - -placeHolder.style.marginTop = computedStyle.marginTop; // (1) -placeHolder.style.marginBottom = computedStyle.marginBottom; -``` - -В строке `(1)` использование полного название свойства `"marginTop"` гарантирует, что полученное значение будет корректным. \ No newline at end of file diff --git a/2-ui/1-document/15-metrics/3-div-placeholder/solution.view/index.html b/2-ui/1-document/15-metrics/3-div-placeholder/solution.view/index.html deleted file mode 100755 index fd8f91f0..00000000 --- a/2-ui/1-document/15-metrics/3-div-placeholder/solution.view/index.html +++ /dev/null @@ -1,50 +0,0 @@ - - - - - - - - - - Before Before Before - -
        - Text Text Text -
        Text Text Text -
        -
        - - After After After - - - - - - - \ No newline at end of file diff --git a/2-ui/1-document/15-metrics/3-div-placeholder/source.view/index.html b/2-ui/1-document/15-metrics/3-div-placeholder/source.view/index.html deleted file mode 100755 index 69e3e504..00000000 --- a/2-ui/1-document/15-metrics/3-div-placeholder/source.view/index.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - Before Before Before - -
        - Text Text Text -
        Text Text Text -
        -
        - - After After After - - - - - - \ No newline at end of file diff --git a/2-ui/1-document/15-metrics/3-div-placeholder/task.md b/2-ui/1-document/15-metrics/3-div-placeholder/task.md deleted file mode 100644 index 3fa0528f..00000000 --- a/2-ui/1-document/15-metrics/3-div-placeholder/task.md +++ /dev/null @@ -1,52 +0,0 @@ -# Подменить div на другой с таким же размером - -[importance 3] - -Посмотрим следующий случай из жизни. Был текст, который, в частности, содержал `div` с зелеными границами: - -```html - - - -Before Before Before - -
        -Text Text Text
        -Text Text Text
        -
        - -After After After -``` - -Программист Валера из вашей команды написал код, который позиционирует его абсолютно и смещает в правый верхний угол. Вот этот код: - -```js -var div = document.getElementById('moving-div'); -div.style.position = 'absolute'; -div.style.right = div.style.top = 0; -``` - -Побочным результатом явилось смещение текста, который раньше шел после `DIV`. Теперь он поднялся вверх: -[iframe height=90 src="source"] - -**Допишите код Валеры, сделав так, чтобы текст оставался на своем месте после того, как `DIV` будет смещен.** - -Сделайте это путем создания вспомогательного `DIV` с теми же `width`, `height`, `border`, `margin`, `padding`, что и у желтого `DIV`. - -Используйте только JavaScript, без CSS. - -Должно быть так (новому блоку задан фоновый цвет для демонстрации): - -[iframe height=140 src="solution"] - - - - - diff --git a/2-ui/1-document/15-metrics/4-put-ball-in-center/ball-half/index.html b/2-ui/1-document/15-metrics/4-put-ball-in-center/ball-half/index.html deleted file mode 100755 index 23b8d7b2..00000000 --- a/2-ui/1-document/15-metrics/4-put-ball-in-center/ball-half/index.html +++ /dev/null @@ -1,41 +0,0 @@ - - - - - - - - - - -
        - . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . - . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . -
        - - - - - - - - \ No newline at end of file diff --git a/2-ui/1-document/15-metrics/4-put-ball-in-center/field.png b/2-ui/1-document/15-metrics/4-put-ball-in-center/field.png deleted file mode 100755 index eea8c1715d2aa73997fb8dce955bf81470e3c36a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1693 zcmZ|QeN@u-9tZFbYLVc>nkaHDjhi>!nwpteiQRRRt0}37x_k(m*31o~))W!TO>vf@ zCYDbDK1?OerOu~WP?^h8TAVc-c1XRmX=1pbu}h@b=p9u1^W zC_zC%)Te{S zfX5T^3J_HVg@~%c!rH;i#6AS@9gL}j9?s;cVh>Y5!;;|$-WWz_x)YHMrj>+8it5Hrq+#o`;=;6?(Yp`oF% zvGJBIG<&(X;-Iaqt=$sZKXB}@M0J{@IxV2f41P32-L|oonr@O}Oz#6|G@9w@X{}Z} zGcz+gJFC;_78VwkmzP&oR`hzk!C+WlU-$Wjcoo2edBpcnSnB_@BN~>aGaFZmQ zHnq^CBSvD9xt!W?{L~xOsYr2aO7iCB@W!FY&-dVPXmXh3>woTYzL9ST6qY+i$F(KW zCZY7G7=J$ma{p7`bm{T=ft~8?9+!r%jgQU14ql8e30_!H%SO{AKtzL zS8BPG;l*@ub8zfvj*{4U6%1YD_+{2!tonJl#jE^>4?H+o4c$=#!~1l40eL^kj*+n( zDk8NyEjs?FFQ}8m$J)0ObNJhu$wG<8T*>ARJsA%0pVN5x4rI;Zn2+s*FBFtHoiSV$8dFd^$l7%uI_k`#`$Qcro&bdt!`7qMKSB- zbZh`N6-n*?GNwAJ6q$5vn#&Er-zCm}zWCS9tLpz({x+EE_!=qfn2%8;UECy-1-s^` zlkyZVQ4`$)-2{4bvi?BRK$bXUL)13z zEQn1U53>lLp}m%oA2*Uh@%!sGR9Zz`lNjYM#;{vIj0w(A9}$VXPmubs!aSNTb?i2; z-z|{ax}>_Q;d_*JO|I5F>)scA9-aG$pzfnxUd)Oe&=HzzNy#g6r5%ahH++*{;CE&& zu9BQsRL!@cAEcj)^UQE(%=iS)IDPo()%jy*YW>5GM@6Qe>@&2y!nl6gY80oPn{TJ6{3CvL7HVWd+nbHJ z^X$L_tYpG<*Co~W5nj8fcPXN|16rBNr=2XSft@Au7EV3d0{=&WEu?$V?9PbVOJc)kL zf1)Yy`-hxYo!c4|44%rcHa1fpoM1UrHZ~>EDKzItGvX5p)&|eoOxWeK1AjfXg0DNZ WdT0Dl@9{tXnIq&N-&_AVk@*MFp&!=( diff --git a/2-ui/1-document/15-metrics/4-put-ball-in-center/solution.md b/2-ui/1-document/15-metrics/4-put-ball-in-center/solution.md deleted file mode 100644 index 07ccdf60..00000000 --- a/2-ui/1-document/15-metrics/4-put-ball-in-center/solution.md +++ /dev/null @@ -1,51 +0,0 @@ -При абсолютном позиционировании мяча внутри поля его координаты `left/top` отсчитываются от **внутреннего** угла поля, например верхнего-левого: - - - -Метрики для внутренней зоны поля -- это `clientWidth/Height`. - -Центр - это `(clientWidth/2, clientHeight/2)`. - -Но если мы установим мячу такие значения `ball.style.left/top`, то в центре будет не сам мяч, а его левый верхний угол: - -```js -var ball = document.getElementById('ball'); -var field = document.getElementById('field'); - -ball.style.left = Math.round(field.clientWidth / 2) + 'px'; -ball.style.top = Math.round(field.clientHeight / 2) + 'px'; -``` - -[iframe hide="Нажмите, чтобы посмотреть текущий результат" height=180 src="ball-half"] - -Для того, чтобы центр мяча находился в центре поля, нам нужно сместить мяч на половину его ширины влево и на половину его высоты вверх. - -```js -var ball = document.getElementById('ball'); -var field = document.getElementById('field'); - -ball.style.left = Math.round(field.clientWidth / 2 - ball.offsetWidth / 2) + 'px'; -ball.style.top = Math.round(field.clientHeight / 2 - ball.offsetHeight / 2) + 'px'; -``` - -**Внимание, подводный камень!** - -Код выше стабильно работать не будет, потому что `IMG` идет без ширины/высоты: - -```html - -``` - -**Высота и ширина изображения неизвестны браузеру до тех пор, пока оно не загрузится, если размер не указан явно.** - -После первой загрузки изображение уже будет в кеше браузера, и его размеры будут известны. Но когда браузер впервые видит документ -- он ничего не знает о картинке, поэтому значение `ball.offsetWidth` равно `0`. Вычислить координаты невозможно. - -Чтобы это исправить, добавим `width/height` к картинке: - -```html - -``` - -Теперь браузер всегда знает ширину и высоту, так что все работает. Тот же эффект дало бы указание размеров в CSS. - -[edit src="solution"]Полный код решения[/edit] \ No newline at end of file diff --git a/2-ui/1-document/15-metrics/4-put-ball-in-center/solution.view/index.html b/2-ui/1-document/15-metrics/4-put-ball-in-center/solution.view/index.html deleted file mode 100755 index 47694b5a..00000000 --- a/2-ui/1-document/15-metrics/4-put-ball-in-center/solution.view/index.html +++ /dev/null @@ -1,41 +0,0 @@ - - - - - - - - - - -
        - . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . - . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . -
        - - - - - - - - \ No newline at end of file diff --git a/2-ui/1-document/15-metrics/4-put-ball-in-center/source.view/index.html b/2-ui/1-document/15-metrics/4-put-ball-in-center/source.view/index.html deleted file mode 100755 index 8b54beed..00000000 --- a/2-ui/1-document/15-metrics/4-put-ball-in-center/source.view/index.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - -
        - . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . - . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . -
        - - - - - \ No newline at end of file diff --git a/2-ui/1-document/15-metrics/4-put-ball-in-center/task.md b/2-ui/1-document/15-metrics/4-put-ball-in-center/task.md deleted file mode 100644 index 305acfb8..00000000 --- a/2-ui/1-document/15-metrics/4-put-ball-in-center/task.md +++ /dev/null @@ -1,19 +0,0 @@ -# Поместите мяч в центр поля - -[importance 5] - -Поместите мяч в центр поля. - -Исходный документ выглядит так: -[iframe src="source" edit link height=180] - -**Используйте JavaScript, чтобы поместить мяч в центр:** -[iframe src="solution" height=180] - -
          -
        • Менять CSS нельзя, мяч должен переносить в центр ваш скрипт, через установку нужных стилей элемента.
        • -
        • JavaScript-код должен работать при разных размерах мяча (`10`, `20`, `30` пикселей) без изменений.
        • -
        • JavaScript-код должен работать при различных размерах и местоположениях поля на странице без изменений. Также он не должен зависеть от ширины рамки поля `border`.
        • -
        - -P.S. Да, центрирование можно сделать при помощи чистого CSS, но задача именно на JavaScript. Далее будут другие темы и более сложные ситуации, когда JavaScript будет уже точно необходим, это -- своего рода "разминка". diff --git a/2-ui/1-document/15-metrics/5-expand-element/solution.md b/2-ui/1-document/15-metrics/5-expand-element/solution.md deleted file mode 100644 index a8b2e2ec..00000000 --- a/2-ui/1-document/15-metrics/5-expand-element/solution.md +++ /dev/null @@ -1,43 +0,0 @@ -# Решение через width: auto - -Вначале рассмотрим решение через "умную" установку CSS-свойства. - -Они могут быть разными. Самое простое выглядит так: - -```js -elem.style.width = 'auto'; -``` - -Такой способ работает, так как `
        ` по умолчанию распахивается на всю ширину. - -Конечно, такое решение не будет работать для элементов, которые сами по себе не растягиваются, например в случае со `` или при наличии `position: absolute`. - -Обратим внимание, такой вариант был бы неверен: -```js -elem.style.width = '100%'; -``` - -По умолчанию в CSS ширина `width` -- это то, что *внутри `padding`*, а проценты отсчитываются от ширины родителя. То есть, ставя ширину в `100%`, мы говорим: "внутренняя область должна занимать `100%` ширины родителя". А в элементе есть ещё `padding`, которые в итоге вылезут наружу. - -Можно бы поменять блочную модель, указав `box-sizing` через свойство `elem.style.boxSizing`, но такое изменение потенциально может затронуть много других свойств, поэтому нежелательно. - -# Точное вычисление - -Альтернатива -- вычислить ширину родителя через `clientWidth`. - -Доступную внутреннюю ширину родителя можно получить, вычитая из `clientWidth` размеры `paddingLeft/paddingRight`, и затем присвоить её элементу: - -```js -var bodyClientWidth = document.body.clientWidth; - -var style = getComputedStyle(elem); - -*!* -var bodyInnerWidth = bodyClientWidth - parseInt(style.paddingLeft) - parseInt(style.paddingRight); -*/!* - -elem.style.width = bodyInnerWidth + 'px'; -``` - -Такое решение будет работать всегда, вне зависимости от типа элемента. Конечно, при изменении размеров окна браузера ширина не адаптируется к новому размеру автоматически, как с `width:auto`. Это недостаток. Его, конечно, тоже можно обойти при помощи событий (изучим далее), но как общий рецепт -- если CSS может решить задачу -- лучше использовать CSS. - diff --git a/2-ui/1-document/15-metrics/5-expand-element/solution.view/index.html b/2-ui/1-document/15-metrics/5-expand-element/solution.view/index.html deleted file mode 100755 index 6c51d6ad..00000000 --- a/2-ui/1-document/15-metrics/5-expand-element/solution.view/index.html +++ /dev/null @@ -1,53 +0,0 @@ - - - - - - - - - - -
        - текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст - текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст - текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст - текст текст -
        - - - - - - - \ No newline at end of file diff --git a/2-ui/1-document/15-metrics/5-expand-element/source.view/index.html b/2-ui/1-document/15-metrics/5-expand-element/source.view/index.html deleted file mode 100755 index 4bfe7fee..00000000 --- a/2-ui/1-document/15-metrics/5-expand-element/source.view/index.html +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - - - - - -
        - текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст - текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст - текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст - текст текст -
        - - - - - - - \ No newline at end of file diff --git a/2-ui/1-document/15-metrics/5-expand-element/task.md b/2-ui/1-document/15-metrics/5-expand-element/task.md deleted file mode 100644 index 88d72e2f..00000000 --- a/2-ui/1-document/15-metrics/5-expand-element/task.md +++ /dev/null @@ -1,15 +0,0 @@ -# Расширить элемент - -[importance 4] - -В `` есть элемент `
        ` с заданной шириной `width`. - -Задача -- написать код, который "распахнет" `
        ` по ширине на всю страницу. - -Исходный документ (`
        ` содержит текст и прокрутку): -[iframe height=220 src="source"] - -P.S. Пользоваться следует исключительно средствами JS, CSS в этой задаче менять нельзя. Также ваш код должен быть универсален и не ломаться, если цифры в CSS станут другими. - -P.P.S. При расширении элемент `
        ` не должен вылезти за границу ``. - diff --git a/2-ui/1-document/15-metrics/6-width-vs-clientwidth/solution.md b/2-ui/1-document/15-metrics/6-width-vs-clientwidth/solution.md deleted file mode 100644 index c1e83eff..00000000 --- a/2-ui/1-document/15-metrics/6-width-vs-clientwidth/solution.md +++ /dev/null @@ -1,11 +0,0 @@ -Отличия: - -
          -
        1. `getComputedStyle` не работает в IE8-.
        2. -
        3. `clientWidth` возвращает число, а `getComputedStyle(...).width` -- строку, на конце `px`.
        4. -
        5. `getComputedStyle` не всегда даст ширину, он может вернуть, к примеру, `"auto"` для инлайнового элемента.
        6. -
        7. `clientWidth` соответствует внутренней видимой области элемента, *включая `padding`, а CSS-ширина `width` при стандартном значении `box-sizing` соответствует зоне *внутри `padding`*.
        8. -
        9. Если есть полоса прокрутки, то некоторые браузеры включают её ширину в `width`, а некоторые -- нет. - -Свойство `clientWidth`, с другой стороны, полностью кросс-браузерно. Оно всегда обозначает размер *за вычетом прокрутки*, т.е. реально доступный для содержимого.
        10. -
        diff --git a/2-ui/1-document/15-metrics/6-width-vs-clientwidth/task.md b/2-ui/1-document/15-metrics/6-width-vs-clientwidth/task.md deleted file mode 100644 index 582a2473..00000000 --- a/2-ui/1-document/15-metrics/6-width-vs-clientwidth/task.md +++ /dev/null @@ -1,7 +0,0 @@ -# В чём отличие "width" и "clientWidth" ? - -[importance 5] - -В чём отличия между `getComputedStyle(elem).width` и `elem.clientWidth`? - -Укажите хотя бы три отличия, лучше -- больше. \ No newline at end of file diff --git a/2-ui/1-document/15-metrics/article.md b/2-ui/1-document/15-metrics/article.md deleted file mode 100644 index 39f78ae3..00000000 --- a/2-ui/1-document/15-metrics/article.md +++ /dev/null @@ -1,317 +0,0 @@ -# Размеры и прокрутка элементов - -Для того, чтобы показывать элементы на произвольных местах страницы, необходимо во-первых, знать CSS-позиционирование, а во-вторых -- уметь работать с "геометрией элементов" из JavaScript. - -В этой главе мы поговорим о размерах элементов DOM, способах их вычисления и *метриках* -- различных свойствах, которые содержат эту информацию. - -[cut] - -## Образец документа - -Мы будем использовать для примера вот такой элемент, у которого есть рамка (border), поля (padding), и прокрутка: - -```html - -
        - ...Текст... -
        - -``` - -У него нет отступов `margin`, в этой главе они не важны, так как метрики касаются именно размеров самого элемента, отступы в них не учитываются. - -Результат выглядит так: - - - -Вы можете открыть [edit src="metric"]этот документ в песочнице[/edit]. - -[smart header="Внимание, полоса прокрутки!"] -В иллюстрации выше намеренно продемонстрирован самый сложный и полный случай, когда у элемента есть ещё и полоса прокрутки. - -В этом случае полоса прокрутки "отодвигает" содержимое вместе с `padding` влево, отбирая у него место. - -Именно поэтому ширина содержимого обозначена как `content width` и равна `284px`, а не `300px`, как в CSS. - -Точное значение получено в предположении, что ширина полосы прокрутки равна `16px`, то есть после её вычитания на содержимое остаётся `300 - 16 = 284px`. Конечно, она сильно зависит от браузера, устройства, ОС. - -Мы должны в точности понимать, что происходит с размерами элемента при наличии полосы прокрутки, поэтому на картинке выше это отражено. -[/smart] - -[smart header="Поле `padding` заполнено текстом"] -Обычно поля `padding` изображают пустыми, но так как текста много, то он заполняет нижнее поле `padding-bottom` в примере выше. - -Во избежание путаницы заметим, что `padding` там, всё же, есть. Поля `padding` по CSS в элементе выше одинаковы со всех сторон. А такое заполнение -- нормальное поведение браузера. -[/smart] - -## Метрики - -У элементов существует ряд свойств, содержащих их внешние и внутренние размеры. Мы будем называть их "метриками". - -Метрики, в отличие от свойств CSS, содержат числа, всегда в пикселях и без единиц измерения на конце. - -Вот общая картина: - - - - -На картинке все они с трудом помещаются, но, как мы увидим далее, их значения просты и понятны. - -Будем исследовать их снаружи элемента и вовнутрь. - - -## offsetParent, offsetLeft/Top - -Ситуации, когда эти свойства нужны, можно перечислить по пальцам. Они возникают действительно редко. Как правило, эти свойства используют, потому что не знают средств правильной работы с координатами, о которых мы поговорим позже. - -Несмотря на то, что эти свойства нужны реже всего, они -- самые "внешние", поэтому начнём с них. - -**В `offsetParent` находится ссылка на родительский элемент в смысле отображения на странице.** - -Уточним, что имеется в виду. - -Когда браузер рисует страницу, то он высчитывает дерево расположения элементов, иначе говоря "дерево геометрии" или "дерево рендеринга", которое содержит всю информацию о размерах. - -При этом одни элементы естественным образом рисуются внутри других. Но, к примеру, если у элемента стоит `position:absolute`, то его расположение вычисляется уже не относительно непосредственного родителя `parentNode`, а относительно ближайшего позиционированного элемента (т.е. свойство `position` которого не равно `static`), или `BODY`, если такой отсутствует. - -Получается, что элемент имеет в дополнение к обычному родителю в DOM -- ещё одного "родителя по позиционированию", то есть относительно которого он рисуется. Этот элемент и будет в свойстве `offsetParent`. - -**Свойства `offsetLeft/Top` задают смещение относительно `offsetParent`.** - -В примере ниже внутренний `
        ` имеет DOM-родителя `
        `, но `offsetParent` у него `
        `, и сдвиги относительно его верхнего-левого угла будут в `offsetLeft/Top`: - -```html -
        - -
        ...
        - -
        -``` - - - -## offsetWidth/Height - -Теперь переходим к самому элементу. - -Эти два свойства -- самые простые. Они содержат "внешнюю" ширину/высоту элемента, то есть его полный размер, включая рамки `border`. - - - -Для нашего элемента: -
          -
        • `offsetWidth = 390` -- внешняя ширина блока, её можно получить сложением CSS-ширины (`300px`, но её часть на рисунке выше отнимает прокрутка, поэтому `284 + 16`), полей(`2*20px`) и рамок (`2*25px`).
        • -
        • `offsetHeight = 290` -- внешняя высота блока.
        • -
        - - -[smart header="Метрики для невидимых элементов равны нулю."] - -Координаты и размеры в JavaScript устанавливаются только для *видимых* элементов. - -Для элементов с `display:none` или находящихся вне документа дерево рендеринга не строится. Для них метрики равны нулю. Кстати, и `offsetParent` для таких элементов тоже `null`. - -**Это дает нам замечательный способ для проверки, виден ли элемент**: - -```js -function isHidden(elem) { - return !elem.offsetWidth && !elem.offsetHeight; -} -``` - -
          -
        • Работает, даже если родителю элемента установлено свойство `display:none`.
        • -
        • Работает для всех элементов, кроме `TR`, с которым возникают некоторые проблемы в разных браузерах. Обычно, проверяются не `TR`, поэтому всё ок.
        • -
        • Считает элемент видимым, даже если позиционирован за пределами экрана или имеет свойство `visibility:hidden`.
        • -
        • "Схлопнутый" элемент, например пустой `div` без высоты и ширины, будет считаться невидимым.
        • -
        -[/smart] - - - -## clientTop/Left - -Далее внутри элемента у нас рамки `border`. - -Для них есть свойства-метрики `clientTop` и `clientLeft`. - -В нашем примере: -
          -
        • `clientLeft = 25` -- ширина левой рамки
        • -
        • `clientTop = 25` -- ширина верхней рамки
        • -
        - - - -...Но на самом деле они -- вовсе не рамки, а отступ внутренней части элемента от внешней. - -В чём же разница? - -Она возникает тогда, когда документ располагается *справа налево* (операционная система на арабском языке или иврите). Полоса прокрутки в этом случае находится слева, и тогда свойство `clientLeft` включает в себя еще и ширину полосы прокрутки. - -Получится так: - - - - -## clientWidth/Height - -Эти свойства -- размер элемента внутри рамок `border`. - -Они включают в себя ширину содержимого `width` вместе с полями `padding`, но без прокрутки. - - - -На рисунке выше посмотрим вначале на `clientHeight`, её посчитать проще всего. Прокрутки нет, так что это в точности то, что внутри рамок: CSS-высота `200px` плюс верхнее и нижнее поля `padding` (по `20px`), итого `240px`. - -На рисунке нижний `padding` заполнен текстом, но это неважно: по правилам он всегда входит в `clientHeight`. - -Теперь `clientWidth` -- ширина содержимого здесь не равна CSS-ширине, её часть "съедает" полоса прокрутки. -Поэтому в `clientWidth` входит не CSS-ширина, а реальная ширина содержимого `284px` плюс левое и правое поля `padding` (по `20px`), итого `324px`. - - -**Если `padding` нет, то `clientWidth/Height` в точности равны размеру области содержимого, внутри рамок и полосы прокрутки.** - - - -Поэтому в тех случаях, когда мы точно знаем, что `padding` нет, их используют для определения внутренних размеров элемента. - -## scrollWidth/Height - -Эти свойства -- аналоги `clientWidth/clientHeight`, но с учетом прокрутки. - -Свойства `clientWidth/clientHeight` относятся только к видимой области элемента, а `scrollWidth/scrollHeight` добавляют к ней прокрученную (которую не видно) по горизонтали/вертикали. - - - -На рисунке выше: -
          -
        • `scrollHeight = 723` -- полная внутренняя высота, включая прокрученную область.
        • -
        • `scrollWidth = 324` -- полная внутренняя ширина, в данном случае прокрутки нет, поэтому она равна `clientWidth`.
        • -
        - -Эти свойства можно использовать, чтобы "распахнуть" элемент на всю ширину/высоту, таким кодом: - -```js -element.style.height = element.scrollHeight + 'px'; -``` - -[online] -[pre no-typography] -Нажмите на кнопку, чтобы распахнуть элемент: - -
        текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст
        - - -[/pre] -[/online] - -## scrollLeft/scrollTop - -Свойства `scrollLeft/scrollTop` -- ширина/высота невидимой, прокрученной в данный момент, части элемента слева и сверху. - -Следующее иллюстрация показывает значения `scrollHeight` и `scrollTop` для блока с вертикальной прокруткой. - - - -[smart header="`scrollLeft/scrollTop` можно изменять"] -В отличие от большинства свойств, которые доступны только для чтения, значения `scrollLeft/scrollTop` можно изменить, и браузер выполнит прокрутку элемента. - -[online] -При клике на следующий элемент будет выполняться код `elem.scrollTop += 10`. Поэтому он будет прокручиваться на `10px` вниз: - -
        Кликни
        Меня
        1
        2
        3
        4
        5
        6
        7
        8
        9
        -[/online] -[/smart] - - -## Не стоит брать width/height из CSS - -Мы рассмотрели метрики -- свойства, которые есть у DOM-элементов. Их обычно используют для получения их различных высот, ширин и прочих расстояний. - -Теперь несколько слов о том, как *не* надо делать. - -Как мы знаем, CSS-высоту и ширину можно установить с помощью `elem.style` и извлечь, используя `getComputedStyle`, которые в подробностях обсуждаются в главе [](/styles-and-classes). - -Получение ширины элемента может быть таким: - -```js -//+ run -var elem = document.body; - -alert( getComputedStyle(elem).width ); // вывести CSS-ширину для elem -``` - -Не лучше ли получать ширину так, вместо метрик? Вовсе нет! - -
          -
        1. Во-первых, CSS-свойства `width/height` зависят от другого свойства -- `box-sizing`, которое определяет, что такое, собственно, эти ширина и высота. Получается, что изменение `box-sizing`, к примеру, для более удобной вёрстки, сломает такой JavaScript.
        2. -
        3. Во-вторых, в CSS свойства `width/height` могут быть равны `auto`, например, для инлайн-элемента: - -```html - -Привет! - - -``` - -Конечно, с точки зрения CSS размер `auto` -- совершенно нормально, но нам-то в JavaScript нужен конкретный размер в пикселях, который мы могли бы использовать для вычислений. Получается, что в данном случае ширина `width` из CSS вообще бесполезна. -
        4. -
        - -Есть и ещё одна причина. - -Полоса прокрутки -- причина многих проблем и недопониманий. Как говорится, "дьявол кроется в деталях". Недопустимо, чтобы наш код работал на элементах без прокрутки и начинал "глючить" с ней. - -Как мы говорили ранее, при наличии вертикальной полосы прокрутки, в зависимости от браузера, устройства и операционной системы, она может сдвинуть содержимое. - -Получается, что реальная ширина содержимого меньше CSS-ширины. И это учитывают свойства `clientWidth/clientHeight`. - -...Но при этом некоторые браузеры также учитывают это в результате `getComputedStyle(elem).width`, то есть возвращают реальную внутреннюю ширину, а некоторые -- именно CSS-свойство. Эти кросс-браузерные отличия -- ещё один повод не использовать такой подход, а использовать свойства-метрики. - -[online] -Если ваш браузер показывает полосу прокрутки (например, под Windows почти все браузеры так делают), то вы можете протестировать это сами, нажав на кнопку в ифрейме ниже. - -[iframe src="cssWidthScroll" link border=1] - -У элемента с текстом в стилях указано `width:300px`. - -На момент написания этой главы при тестировании в Chrome под Windows `alert` выводил `283px`, а в Firefox -- `300px`. При этом оба браузера показывали прокрутку. Это из-за того, что Firefox возвращал именно CSS-ширину, а Chrome -- реальную ширину, за вычетом прокрутки. -[/online] - -Описанные разночтения касаются только чтения свойства `getComputedStyle(...).width` из JavaScript, визуальное отображение корректно в обоих случаях. - -## Итого - -У элементов есть следующие метрики: -
          -
        • `offsetParent` -- "родитель по дереву рендеринга" -- ближайшая ячейка таблицы, body для статического позиционирования или ближайший позиционированный элемент для других типов позиционирования.
        • -
        • `offsetLeft/offsetTop` -- позиция в пикселях левого верхнего угла блока, относительно его `offsetParent`.
        • -
        • `offsetWidth/offsetHeight` -- "внешняя" ширина/высота блока, включая рамки.
        • -
        • `clientLeft/clientTop` -- отступ области содержимого от левого-верхнего угла элемента. Если операционная система располагает вертикальную прокрутку справа, то равны ширинам левой/верхней рамки, если же слева (ОС на иврите, арабском), то `clientLeft` включает в себя прокрутку. -
        • -
        • `clientWidth/clientHeight` -- ширина/высота содержимого вместе с полями `padding`, но без полосы прокрутки.
        • -
        • `scrollWidth/scrollHeight` -- ширина/высота содержимого, включая прокручиваемую область. Включает в себя `padding` и не включает полосы прокрутки.
        • -
        • `scrollLeft/scrollTop` -- ширина/высота прокрученной части документа, считается от верхнего левого угла.
        • -
        - -Все свойства, доступны только для чтения, кроме `scrollLeft/scrollTop`. Изменение этих свойств заставляет браузер прокручивать элемент. - -В этой главе мы считали, что страница находится в режиме соответствия стандартам. В режиме совместимости -- некоторые старые браузеры требуют `document.body` вместо `documentElement`, в остальном всё так же. Конечно, по возможности, стоит использовать только режим соответствия стандарту. - diff --git a/2-ui/1-document/15-metrics/cssWidthScroll.view/index.html b/2-ui/1-document/15-metrics/cssWidthScroll.view/index.html deleted file mode 100755 index a29f8a3a..00000000 --- a/2-ui/1-document/15-metrics/cssWidthScroll.view/index.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - -
        - текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст - текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст - текст текст текст текст текст текст текст текст текст текст текст текст текст текст -
        - - - - У элемента стоит style="width:300px" -
        - - - - - - \ No newline at end of file diff --git a/2-ui/1-document/15-metrics/metric-all.png b/2-ui/1-document/15-metrics/metric-all.png deleted file mode 100644 index fb7c3b7b678c8d8a40ca37123bab7bed2cd9cf69..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 142969 zcmeFZRa9MD5-tpc0KqpN+zB4s-Q8V-ySux)yGwBQV8J1Pnw^yxe9%m4mA zFxD7r>{Y8)Rn1vneY1*CS!oeCXiR7j5D+*qQ9*eS5U{NGKXoXG_d7udB6RN;P;n)GUJx-sK1CPM0`>CqXAQx(|QG%@VM=DFU?xfs@nfUfDBZ~ zSEojo%3`^~j`6vkr}Mh8*1nY=f4{}o(FX(>==eP(4@N}C+lp6d2JpPDUT~HA9~ItT z=gY_I6S{{V@tghtan)_sJn-97gXk6mQ5V#Aun3U9E-!*Up~gHDI=hXAN~*#?8@E?MBc@T9s7Z9eCTSn)89ZzP4 z<+&7^-CP8jvDo9$C6Dx{8KmH&JU5a z+sQRrN=a0kCBwU@{N>GPu7sJue;e|z%QXxrY1RwBSLz~{)2IZCSeRW6iL{)~G$Lgs zIgny%@c%N2zt3#8QOnE@e@;fE3ap53Q_P-&8KjLR#*Q%NaEJ#t!+*T=E_|F8JjLY} z=E2bH?pGBLPGUjv8S$ms?;evqE;IjA z02b7{iLgwnTgv{&aL6Bq6U<&R`iB7BPamQ6369x0@t*}i$$PXTZN@1Y3CIKQm)Puo0(zTfrA16uym>easQesA%GNN*ed zhi!OyK7!`|H}3yul3SdkNzGvzL++-?f&m-t#-eqtAvDP zmZhotw0{O$gCB?nC!|e*aHB=~H_j5#nKqU_ifq<50i?|^N#ol;)7u<%anc=GDmt`Z zA13A#8Jq>3xHE9OXsX5kYnCpkKLYQokyG?B+vc)Hq!NRGX;_do-k81#CUV&!mT1#d zlJu5f6y0%Ih>SD~91QQjkAA;@UxnCRbnI{X&Z|OZ8^u>YCV*o?tjYgWl8^6QdQL`6mL$*o+^8e(wPajeT`RI4DPZpGl{@g5CS62-@+9)Is}<%nSGP=An<5H$Pas}1mgJMKA2Qjn&1_IDN# z4d+HuL-#HMZ{7o{$e5oH~gOhqk5?z?SOE8jf&{Hd%c1`zh%Dv#G5h z{!H0zSs5H@m$uR6r$nkf2wvrB{OSn+(*&iPy9_oPo&u;Wt?e=Ve&_DTSn>G+gP zg97RE$Tm)bvwfR~wDI3hhWSvD*Y!?0wJWw@HE?gSaa{hTr4J>nh&FWRnckeBohl9j zywb6_6tRBkb({wDB$*1a)!-_M&cCyOg)F#qhv(iyT&ab%Lw03s;|*o7_k`$HcosmH zbC18T*PaH~vz_5j-W+){(xt1;w?-8M>nEzQzkym(h|kE0nJP!%Pd7|t8PGwnv4}m* zYSw0xkLR!^d)^LgDP*pdzF1}a+hPJlIp6ADGr>ZXO$nocnE;bOt+M(t`B@nnWFRQ! z$QAeV!lz+lT(23BlHSsPU88eqLc9;2~;8stsJvXVR4BKPL z-C3oV?w+rakk@O?TVvDn#Ym;8^q%{FQlKsyqRZ$A%}U9)FqKkeJnO-H^8$jZ*nV`b z5BCO#dUEdRPu?Y{(!Kt&6-c{-)E@t(Af9(mDt}(tLD|Cl*#xp^3#R;c-(R>u6&Wgn z?K$;;Dc1x+JgwF0!C6`Iz)LBPMi|vr3;3jspw}#l1KMx@n%{*6d`P+GDx^A6dsN6S z7GdM!ijEkg?EUh0yb%Iq4TlJ`N-eYr1VjD;X3IFBzNuY^OuY?*M>K|>iMru?Ad!0| zGM&zM_r0{%+zhVI@&eGJGYHSS{`~ENL!1)BhK(vsY?WxH9)IJDBp6@)xnBceq z738PUnYP2shXqpYPah{zg>iN2g?uh7;NXyfv(48e4Vws(2{MWPX^h^PV=)3=v#_bz z$~@2GT%K}KSpSARs&h~Ybr)e9P{(MQ4(v>nvt8eZBN-C_4<4rxAX^KVc%)eswg(c2 zYI7@20hnGJ`gq=VH+xcCw&|CtBCNmLX^FZc|AH>n7l^E9M=~NL2M14rK>hzgcx^;o zE{**mo}3z6lXKHojh1ZNa4sFoDkROe|MBBT36k^`w9$ozA!meO%=u&>i>fHfojCn@tnao+f{aAI_B z49nk~4(J`KbS8(1I4e=$dC%Oy!V`@nfX{yb^tO7}YXz1wT<(kQz77~qS}xbgtJ$1{ zMl)9bd>sX(_#-p1LRAZ+a(Q~q(U^Vs3Pg-BN#^3aCoeO*O$+yZ6$6Lu0Add1Wjk3a zw9FDg3+xxX(1@%!)P`kis%Fo3i(q(wBQhZ7Cd&K$xKiFC0d|f|{~|fq$Ul>j7JmwR zqU9>kc|tUrzt;sFX3aHibl+nq! zT0_UXt__d$4%i`084p`A9HNS6oHv+#`?ejY2-#09uHRxcck^%bj&=*!u}R#GQIyi{ zt${}lTsT~HN(v3AP2lW~Djo5-5~Cx#wc5`=kn))VshS3+Or}n54FuW$RW0lXbe+$) zAc)4Ph-0^Yx1d$AanFjoyfkvheBS`ee0h8FYB3{ivDyi~-)OKLa~QvgSOJ&M7hNna zRYjG#1{BWP4)2DA5A?POPww2~Yn{ZY2j*lrnHk`x^2^IDgCFb)HwOz9h%mUSrGH4z zC^n!Fm{U&vEAVnu!2gAb#NIH@R#D14HlGp1kX{CuG8Y&W;?Ic7f)pR_XXYe?y%?Q# z{@}!BBFsIvx}lEkVE78*zt;tToC=4;6%MEEyx=!B+2>-~wLMBSS}Dc)lQA=HKu4Ej z;4j~2+qlsC7`2K?r|!7zX`G?G_JGBP^s$hKY2F3|=ks&d$g!co|AFe9lzwD6LWK%6MjA5sX`y>4702H# zJH27IXEO@msr^fd^k9Y42d*y%2a5${#i z-Vu5wRY!Od?!v>;J>+?*5R57$>Wi`<7O(99U#;dB}YMt-#Agi zU>ur55HqIgU5hc3+-Y)+k58tkJRtyn zYNCYNNhLs#9uT^}SPCw(aItCrzRp#-z{lR^Go9tk?+-jwuj}jqV}{^KpL};xb~NF+ zRE5dFZ_~tISC1OgMRcm1DH>NVQG`lmwoUD8%T>sCCK7&E&o_w&|2Pz`=i#oPo1TLo3xsvh zkVUh>MQsr|r(uA=h##$O-yQpFH5Xs_sl&}?Y~s`!Zkyzq^8Ci3OR7DR!Xj0()#- z+sl~D>AbK3`c zT$)TT-)wBdb<;Ez;MS%nVe}xzi3r*FI0GE8chEBb#m3| zC`Rwf3>M**xTG#mJ;P|u{j+%l)vjCGux;li&zt3I#s>p+g!eyn%6`S$Bu_{dly!$v zRJuwi<2#{K76>BKP=z)LV=7`Vw571RG}5GX6+e9tDzS4C#gfxHP$J{Xbd?$yq7Gw- z&T+OB1`Ble(F9`E^N=1unB773U+`h}>8E!)P2L2bLHp>NeKalv1o!0WyG)tI6`A`6C(BcOe6nuCQ6+WMJzn&-)n%5)FBrO;=~ARe%BhwIHjf`8G1xmkysj0 zl4nvOcU7w|uF}b5fecX|%v+ywnJnZ^0zJlpIg{O;N;xw{BV^fRXyP%2aifIUG<1P~ z931RRV(zwU)v{4Nt&{f8Y?Jy)kwPcFo#-l(qh_iOmym`&8YGnC*J)qV?p~=f6*|dk za?zw2Fnupi-bDV`Fp0pWUuR!E4b_>+8}}NF9vatL`k$|v+KgA7XS^el?UIwm;(6+# zT8FjNh@j3TjPW7GnQ8A~$SrVRe$iw*>-U&BziQ~%C(%1i#&AFQ`%b&ji8m~kafwU7 z{HStLcdq1X#802yi@@g=!LG(6)l=BY&7Js?ycCZj2+VP$0D#KWRtW6~xl+Y5B86rM z_Hs;W(x3}P1m_LA4j+e7nHd4!no0 z`SYv0H(}=3X|dtKe&QDDjJv*#Jc-SO-2@$^8; zS)u4578a(k)2m#oZJjhtwaSy7L*LPj(fOyc!W2TXg;}tx%x(W)Et*@vl%xj0)KQdc z-PA_zj}dzD-0fOb@Qy@D3KrknSTY9_CHQS*o(5*7ZxIVu{k}JxCojChZCc^%2hk-j z$~T(UzBkc6#&_=L+F$10cs9JZf4$is;e9^c$ie?UkjMB<+)|M1wbOdp zQF%k7SQ_b5O~}Y!nEL`td*}@t?fyGse6x0$zfB`yru`ucpqI_{2CIIp48DPRFHV}E zPUUOej{CR{%I*hUUhWQl4qwu7#}c)`q5k&PdxpyK&7=MBooLW>9MoW8EpV0C{sJ|- zQ0>KL$S~2$So}8$nF$z7HPUZt93x>%{zy|UrJgs{r;|u%#CKx-nbz|gzfN_cnuq)3 zdKCHf%zBkujKk9^;C24}yv28LSOo;s(^dP9jH=JX%+5UCR=WoKah=&KL**?XYYbqN zAEyAQAdYl|wDT`f3NjsUr2|czYR_^OKpL?$U-vwjur-^V4AWQ}R#!;F0QEnAZ<`bALa9G+IWQ<&MQf$jQYlJQ_2sfKC#c4Z<6-;*prs(v~z=Bk^Q0fq7x3Q zCHw`r<`zmk6C_rap!Hyn&7%_|OY?80yc!hH)PTT(DW-(|(%S_)uo`+kKYA@azeInlI_MEun>K@E)^@h!g@~B>t8CNd1-R^v z=T>i>%JgztG85Pin&q)N>b2F2y^i}h`Oc^he6V0K-7hDZK#2kCr?a_!8J;#B_WSuZ zv+UffIo&PCIS7L;Rk*+EMhFz&sVNyqTKpA1?m4a#MM;A&>o1KX+YZ9IpFe!%w@#zz za8KmziGHGZjXKS7OJ?24g~H>daNpT6OJIp3k5&76D!iy3kMNhccLpy98SJar>vYrF zN+me;!rgt*X8bQZaSk6=&%O^vU2mL5x|(WaR$3@}^)Wb}poDO!YBl_X?7T+=9bB@m zV6awyOj<^(w7kW_B3C?k0llxp(lmAHbUM2*!kDb3EN}&Xzgpe%q#?5~!nDfLhOOBu zljTb1`7xRONA3iBcIG8pG(eU71OC3JvV^DFwU7HdHM5k`$VTjhLgx0u)n#8EWqe5F!cCyl0I zLnCC?T$j_FxwvtzQf-%(PF`*qwA7fAR3&#bls08e{TAp!uFX?SzWS;Tbg2+t8zihs zeJ5M{i)TR6ms0$@YC8*dMfcMC2+n;5U?S47AlrzC{ZW@#rsD!HnTa3Z5{`W zfSUpEM%09IsQcMSE(I*yv_6 zA3NtS3ZhYa%EdjO)@CKv*l*n1cQ>{S+ixwYZ;v3o?M_4r&(OFV&>W33=a|8s8yI}H z?&fokR(FU5Vzv&Se|jC{ep4jY%YDlj-2c4h0#EI2>vjfG+Wsx^w*Zmy+oFOKXTIreXC`ta%{B?>Pg<2(O>!~;-|AuO4$Pc>s3ndAmrqdfzh0p*dM?CmIGR0!; ztkkSUFcwgBs#?J)A)WZpUfCAK>$uafc3MK63`)CEiWE^&!c}>;Qvw*`OJQNcBneQe zy!SG1j9=Zt$f!<0DWXf(Ag*X{#ef_~=^#*t;Mbtk25}3y;=WCR!cdNZGLH1*7lo;$ zUvAu$wjl=-i#UUwW+6vTwR}F2dJ~yqWWk=V>yi{-qh;6Z7^Nqm)tdAthNz*{I>wD9 z(6nGuZ?EJBkY^k8a@YBuVqnZ`mX1c&F}D)4QgI;#g4_J&w#;?IocPvp1hsv?E_3z< z$F8jKIkQ6h<^o2b5mI3eu!i$9=OrB&96-==b-x|jwAc^&uP#WkW8)urvM0mENca^` zUHP(OP$CH;xGBjgHGuqzjk*W{N?Hr+_;9G<0ue!}`nGCf&04mFQ+2!WW*lS);>94t zA2hoTY>Zy6HJi#{RxX}d56-Ie(kNac1Aljqe^qc!T-*qAx>wZ#|C66>%_HD+>Mp_a zlx>YwWfpeRY3InaHOtKY!PuOC`965SQDA(kK;v1!H#`_7?{S|$w@k4Y)sd#S%Hd;H z6(%l7Bl5fZJe4rESd)}Vl9me(N{A-?1`Xx`#Dg;zYVb1@YEh9b4^HNCkbQB!Dpm7^ zyt1J}WlC*a{-d_acEL{uCN^7UsU0AAs14NGxIBT*&$v&#SswUum1(0$-8fvRM0&_F zy#uk#oJee$l7)VsCxLr+g}kq|Eg5s)c3=2;2FHvQx|Ls}@YkeQGKC+g8vOANF=9pg zYQf?or(gquNaaK4UB>ZJ{AQZCxp<&2%MNIWQYC|m^Cv1ysuU^6N%GNDd5?j}1+8MG z=^=g0U*1&r^XD`XNO^gAEdo(%;w=bC((v6`{jZS@oYV!wMail``u&>ys6g{~^-H$I zJRQ- z8Xou$T-G$4=NnVfIT~p=TwX84){FwF>aFvnVwfUOxns`dHfYckxF5e0SZLyh+1gcs z5Kt>=UZ()Lk49Au>(sIpE52cHaNd<13{mI7_FD#IiKxkq;1@GYO^n7)#3FB;k2AiK zp7ViEhF%Je#pB1~XEs}_uw;%wMCf(P@E}344kwu|*D*{Ho!AI{?MteWkrVKyJE8sBXO8?ecMUNN5_%KrkILUfH_%n!p zI1&1yMV2UN1K?^FLX_dt^f36$C?14PtLvadLWw{2*{!5U4;8mkO*nS;6ojudL4tT_eJL3~5S_620I{egl1wEzM% zA=ZEhs3_T~Sg=Q{p(wyE6r9?YbAyaZ)IoI30ZcF!YD!l1E{kv^d&6P6JRE<lCCQ5qug*%!Bp7N)^I@kpYuyv;X1pS9LNqi&3n>J*{;d-7i!oq>YqIyxR-`)30 zOfJM(h8W{P6Y~A6t~`EMa(S;OMTW~Ew>f4v?Fsg$I^X8jq0OKJCslfas-;{79K;0-sXG;u z)=s0oDOgoTjZ`?fMp0t=#FTxEhG?fDOMH#NLh3T=SVtWeE%xEcc(yiJLLQXv)9jjJ z>TS2&EmH(N-#(1quX5KW@kQzRf~<-24h}F>;Z9tP#aYyGOex$*W5VOu9gq4LChgx|_KZcQ0mheXHG>`r%8rOuaD$Yn z<_g!%L1Um*WNNXTV#Nw|nxyBTV3*lLg~9wZcY;aWXu?OJUMq*Q+zDoQt})U1$dwI9 z&+ZL~A>SA&POD)+=}6PL`8#o(P!=oHIAx0&R~OV^CCRzRG81eZ!k>BY|CIJGD=i z?qJedowQkuR^nM=%iKjN1D@!mw2tjJZI*AbR4P|TLhyqCwUY7@UP*>2M*IkoljtH- zowVHu{b5wpLCjLQoMa)*MVOS)i3|gRV;fyJwC#Q|W!`;LHI$_U;CMn6mw8Ch<3@UD zecXf>IfZ1Qk^BYJb`P{^^29-_ddZ)<7{+9s2#cO?4w}qmEs?uVpQDZAK~(u-!6ope zh^%1{0)YX-do&22M;v~J7z0J_9WI@NY@~nK3P%J9o0KkP%fhH zNjHblduZc;YhTGMNI6P|AJ zz}cFRlN@0lQ5ejd%`lqD)v3;k?OY+11hyXe@+a+#PNbp7!}zvo{z+QT{$}6?)?L7- zP`9a_@dG}{Lo(gZA%vtgw5cu?w_IOepEMi{*eF0?zB6SPI7D^q_#|Ew(M;2B9Zg;HlI6_|+O<)4z&??8Xua5yJs!Li`f zvZ=0Wf?Q)tIgHI+H<<7Aax#mnb?lO7odncxw>6Uprg~D%)uJda+Nw$8e(+1DYL80e zZdl3v#qF*C84OaY`%^Y+g)A?q;VHI|kA5GB2kUzt28DLHhqfaR@o7mpe}Zm!^fpY>MeZLJts9^d3p z()|#=K>w`c?qJ^tW4~woy~g}1oR)1X0eEd7gu-UE>(xJg6NROH$~o;oi0p;wUz)B$ zTSI$4_~13z>q*ht@&~9geXszS)624C;DXgsW%Sje5& zk)l@%NDXBZq!DRPv`#lAiST{LH|^S04gH0ppV(@T$R_(*;*X7}1aZK#LyoMBDcXKs z1ZX1O7`+^yFdfmEVU^L`>>dzrGmoGgoQz?>m~)y?(Z$?eSa>P>Z7VEF!%xyVHD07M zR7N_nL**c_xK-Y`V$s%@Ety&1cYOWCQF(IcARAtn^u@R0?RIX?q@GoLV=>!35vRDK zL9ejA=u+@{I2EQ-sUP^D)Xt!CnYi z2&lwZVP#+ZeMi*eFteWKI{L8^pR#%balPagj%9oK$G>|yCjp(C z!csh!7ti_(Wp?%EOG}rBJsm4Ar~LJ<7i{eJ4goe+{qD5CJC#SmL8QvEuh8!}p1ap^ zzU2R6Q2W#AC766_uXQkgxbPB!D%ui@G@FMu!Rxi)trV`r*K3}1bf zKKMBbpFdLXjbkwLk&u`v^%#%Prh1`TrVo@QPvV2xPMm10t0S|;UJY#)II6CEs+(mk ziH3M@yAbysWZ<}-`-^u7sYc(bN1Yp9vw1vPi^VlV0IGZ+jPU1f!wJe@-UKwG0m9kL zSuG1I&onfF0p`RFfcm}X=cvS_PHYN){6CU1mVKMY^*birBCdtXH&2_dC&Y_X9r_2r~zt;2ZS zLEn>^6pYdgbTK8yu1e(-=;EsJ;*On$2FLAUmh{dG_uF#&Z}*DjJk6Sz;*%KT=$#}U zO4r-cmeGZb)yit40v^O#v^6s1nO{Qt?(vf?C}=RrrYtx@rvr6H^}!pK0g?Xnm)?Ne z8Rea|CH{MFPy?NGxgj!GL#Cr9j#G6S{m@KEJH+|CR=6vIFsHFRIaDtu)QHWXcqW$b=7;qmx2?@ST!YX&a1?H8;A+2L31)d;IlemYYu0BI7$i(akr?*Lj->9;CXNK}YgYkqie-ljY>9 zlKmP<4VD^57DA+qxdzgWJ{E)Cgw`qH!p*}rdTp&5Z0VxQYiD-#wDANTCNPgOIXt-9 znj==u|8}{tF@OpUI?I9-2R_D;Rq81~U-S6E1g2J>VPe$g*#B7eJBlNsn1FU${t8C; z(=&e za;-N;a@H{ZkzG=wuJIU>i}D*S{9>^e7S&`LVe-qy#{Ttms-?@=1sgphHk)PK3%#&= zKg{uZ9w0k)6*lwYPDpu_L6Am*A2%Bk-8U6^fcAViF+gN0dnkFhlSVA4&;sC<{cy+w zU%6Yp;3o9G#@%ohn5L^rhC=JK;6-R8-6NAj@JaVcR8um}{S}KssWAKevb~67U>wRs z1tUeLeyxo1v3~~5OFm--bOVlrD%+&@YSn0^xFBp0z81=hk$+|SYLIjVE+BwBBxsQV z)lGWu6UW30aR3|q8#(QiK5odsg&lJRI`erW_v_>Yk?5!G9r}YV{_T8thlEgUz9RgV z&yzK)yV#oxrBbClyNXKr+G_%j!X_H-LnjCYrM&^Z!I4za1M#5~A?8j9uItF~K|qwy zfIa$>AB5kzo92=Uv^4QCY%i_BvkJq)YmKfbXG+n+rL71E-G%L2!tr@R4G1^i36leTScE8ZbnVG&tVh+F1Z#rGtG9y<|` zg95H;8B(MRIX6-fO)HrwsG0>+*kj8L0Wv-y@}yCof`;h)fdK_-ugexBs|v9-1W+?8 z%Qb>v*y%T%XAdOucV4v^u?&sdPhT5*_7J4yG}6IdZBWo8ejhq`xS3taeq#;wQo}=0 z^!kP&o`VUPsuL#6-$pKfKh-oY%1^)O4vfZ2SM9*&1#k2?hp9FhdwBZF%cNEa7tmEJ z6=;e7r@3q-1SA$4LEFxtB8

        U)%3h*9Cg+Ga(}%A$>~Yryl`AFtlpXv@zpc+DCyQ zcC5O-J!s3rkw|vOl^l=odHyI^2$A63 za)6Rj=8Z}~lyVlc`Gwj~k7*GQct8qqC0$}f9dIujbfT}}#l#A^z`wkbMo5mbkbhOH zV!EioKJWt$7!@%;d8`IhuLkjNkk@LDej(=n4wbqbrd`FN-ylScv8VgZKrP+#eN;(V zQbvJWjeWouOO$Nbeee;|;z}^bcT<{T_AW>0U-B6nM5T$j2j-{Z+1dP?iPr2gyhQR`!V0+o=aIu2_4 zip|_@Wi_bu2rZY65;a_sP_{42S_??T%G4o1D*|~*>A1;Sr5y~ecCTj}lqR zAdaR+{}3qXwxvmC7WqVjK6;sJTa#jboNYn3Vnu)SVAxYVm?RmyWip#fkqDwjE3}SS zlp2bwN*F6Mm5&MymWn)zkQVgoGaj)t2%;{p1y3}&S#CB+pGhNY&maU%U*k)pAC~)kna5eswCi;vLFbZ|kk*T)yrsIH;O% zt63SJ=K+ls`0kZ9E7orxsKMr>k|euwVT<~QC{hOysQkxT8ysjp9gtccJXF*3i&NUo zj9}10z%-2{&Nw)OdJcT$skZ8IBP$Qzmfrv+*KkAFlh|j5xH6}rDnwsCw-tN^CKcjV z;%`@(d%E0A#sL+sAcOiC6H~rk#GX+cZny><1*V)97tklI)#_Iu&(`nVWkg47FK*M9 zMR%o=;d<67(2%9QF<+gY^O+7e+ubm2qOp81>MW1Q<9n|P)76GdbY(k1opj|CN$M3; znK;)oCI?uTpGJp_l;A%5*A$k|rH=0Wa#?_nj>xP}v#4#R7Vb2f$;7=xF6hZ+3#(T4 z74%_cN=~=e8R*?`P@koV0e9zq78XkY17T=6KCUNU>A9PTs%y`3Tp?POl~wHzfW3Sw zk4)7h$|1zr)9!c4RpkvfU^jh`3~MwoTZDTXqPck`zcbrJ;dIJ9O0;k5as1e2VuD zwTcwMM3SEpv!%-5b7mE{67_0@B~CH4F#!&Q+yU#T(D(0~VWh!MVp+(v2%PHE`lqyz z0b#q;?eAz2)*?Poj3er^k@r&x9XoqaaVk^8mjiGI`0tAwHd`uo?mfs*V1gBZdgb5n zjbI){y0!Sgcc(vr&&oYpj zBRZIGEA5$FyAh$ZawPhgS0svl^|{VW@?raeBu50!01!0R0Mr#^tD-@oq2C|z?KrUG zAPUA1HZ}Q{haNmw&>#ytuzMkL!KVKF#D&_~Fa+Twz(* z%k=0L%fpBB{UYRV3OPUDFocNBOXX4c)bTZ?Cjk#Aw%lgQ!|a3|d=y&+43qhS#Jm|b z5r9(wHn<*_z{vhOw?OPNzT=P^H`Px=bw)hC?_Hnn$cOzU`~+gZ-Bap4sDiP}ZBVL&_^^FRKkjs4wN*8(FH{eGGdnBKf-idSUG7o)dN}zp4QZCr(y)18Kpm`0i zgngm^H7vXPz$mebcFfs+62{AV?!{+6$Fyffvj;qhZUoRy+<4Jdx_>R5@V&kulFBa;(8_10a*a0*W;Fwl&wG}aM9 ziD{jEm_WOfP15Uwrg_p=9&MaDJP$U**o5yPrE9yst)b2M~lS_GT#^H_NR*7h?Z z4wje8+;mleu7HA( zq%;NLc;-9PqPQ%VHNJyop-x+UL#cDyE36wknpl%l3xPb#V1dGV$iY-l2UdauJsKG3 zdrv2&f7kYPiOTpQe$qMK@!NEue&XTn`E4$X?DfW${@VO&ZlY;oAwAd$V4owE!*(hi zUN%6B}*QpbvT~&y3Kx8r8IpTpU%Cbm_VQ@8=hu6_?v- zTC3uOq}jQJxRWaOgO{?Gw-iqyR(r~s)g^7Pz5miUK0f8f@wR&>g`O-p5pTz2*7lYP zl|hQx0>hI|ruJZ8qdOj!LwFo+N76O8uGVzi6GbJ+vRtn}hMrOH-sgAF!n(qcWYXB@ z!gSg;*ow60mCmmJ^S=P-G^5uZjyXkk!w$ZXmuwAZJt0U;&gDMYx|gsPyOdLAuI z42GN7Zhs}Oy}DhjMXF769G+qGj&RDfSy8{WC{cF%6dsDVwwE#g_F1f?)pK_Ocr+F7 zN@f|MKe*@FtuA4${2StzU%C+2JD+lcOG6kQ$?HQ!9=_MScK@=KVug!JQ!ey52-~p>H@@-;|%blwMFMFGDg`;^DWuuQ34esg| z?EGyRE+$nshc*R`_>bxb0#UckW0Ow);WIc(cDs{9u^(+(p53QA$KG*hBP=FATnMH% zY%p?j0p{*Pv5m`n#MEQfC|6ztb9^xEQ%O1XUC)ER5JcsQmR#M;+_0#vw6%wsf1WJn zSPBnt(x{NC3{H`Pk(eWcQpHprWcmG!r$y7!19d3~^v`9`n{bpfqRy<@_YPqO&Ec-s z()40`@|OaEu5anlds9wQNQNUbuhQhoHaed~XlJ1}4~Q*5*S^@yJQ%OZ@I<@FX!CL) zz0IP;E!M)INh(boAQtkB4NPvXRK^oYg$pKdc2NVUe%*APo>s_iyW{|I8;N|e&dmt8l@rBB`Bk8-ClePX|N;|ohQ0G%~Tp56#+(Jr_c%yP0 zys7i96-PVsTKGJv;e8*jfbcx>2^f1hIo=UW^&8?S*JJf%cFZywksJ>9xu1FihC*eK z1(!3W_^G$s8k^GlaI(q7`qwS4s(79A%R&{FNXL`lhI+E|Gs&A?yXK%CiIZ2|qS;MZ z{4t)E%?Sd>!3&nkS!bfb>f^k7RfHDy@SF8bJi|X?r|C_Z=%@5`Kyu= zCP!iYZ!g3tldm~cA$xj`&aEpC@&w88hK_xC3pM_73wyxv*|>DA`p6=0Czv5rUzDdp ze+Q&gZgMA>-_p#5;tPZh;g$)v)H1FPS{@R_ZQRC4W6bzkHNb-9x{4)SVx5ts?P z(yA{6?JS5lEv~yOjy^{^g^7u7l>_@0#Qs(opWPB^{O)?T8*e|_)7L_rY z51;JL*GwZ!+qssV$7J?$4O*LWsA>Eau{vHlmKZJgczF*@F=BixFpzEl!m!Ah8Jk#1BkND7` zRATh&?&@`A-CL8#YNQ^I(a=qAzID=|RDJcya`DyO>*MXE4Y|9Y!^4gIjzt91qUT}P zS}!6Oqt}|R->-a*4M8sKOoPrmVY8*9ms!jfPP?rmQ~K7ipc&WW^kJ>lzWN_QW%pOokn*T*m(HLY7JdQ(R+POgqUG+p>!M zPG`6o&~~m{Edsvy@5)Y1EIBVSI{vJ+dzRC2Qc|=P`}h%x(sE&CvZAfXJ4dv^=cOYc z7mN2x9`}b-McpN&iEArQB=VUNSR?`~@=qZ3>=Rdpv3$d;>uWfWa>FBAV?sxeKV0X@ z=^4vB)bAUg!Zku>8qe;by@*4ZbaVa-|MYKf&VBSPQZk;rMY{V}w`6X(ERnh-q$ec8#%b26TYjnJo! zRyC_iFyN13Iu(178#Kj=eA=_!TP);){y=CF`@KV+*W-(O$YO)*RtNSOFOsE<_FIo2 z-{8|h@pEe6BG(3X2pdRhHeggODnd$m|>}Ac~ zCo(bSbL2XKJ?Ckw($h+PF?{URj{4#toPD`WY8dyJ{tt$Ow9mU{(z>SZOgcI2^9N^u zC*|b=p`lnNoeEURRXj8_Iw5ePJ;ccXBS~c0v|I_q^f-~u2=+YB;3t!#J={l5G+Q0f z2cwV+P`~F`eN?hfVh1dvR8?WQor#{=W_JNmX}VwZ0q0g@TicTJ%vs2f&CG0esEUED zT;ZCL&t`^XS)q^Xssb!g21hGA;QQMSYY^LPCgac3^tG3sw`?YDVQGK%A-9!&NXJ3@ z)0*_*luIOHqrkP6I`?)`T^a{pB{eYLUq(EBWUXx zI?pHXxf%PBdoFp^1u0VxjeW!YA;|Yw6Z9pThQD97|EM2(@GqO&7e1lQ>Fw@&mEB2i z$W{_&&2Oe%Lkmn7(;t`)5mm*t$P?*6vkiAl=q?C-Jm(I>|A@2!> zhO8H4A{N^u`eIGhlT{nmsSr(v7HCROSlEK0Pzhh)vM7rXM1QAgK*7lwb5F?Pza40+hoSiOD3f4VT)^*+R z_yRK^qh62KBHOU^l?juf;b9B=6p>EkhpFyRWb73BWLC>o`(Cd%BfcPKrlXq^v1yBp zV~tgz94w86Tsn+C;0O36X5!<7y9Tle{BZ{PHLF!;&iWY02h3`1sWl=)I-UviT~pLb zfN+IuOpi+xtmO|6QNSR5fDkE%{ASXLJR_gC#;3J!ttsKTK|iWhQ%S~WtdAYk17XA& zN4v2Fp(CB3OG~_j>^F1T5Py`zPL>F4IQ~6&T+w&{TSGn)r^lbj#>$cM}4m(FrJoUAZp1*IQ zWUo~_=BKaOUEF`og^5ESo+SjjX<0P0m;E+H>^Y?B2QEJVXX?bE{}nFn`-7e41D7>f zcNMAf(bw%wKlG;&T#LMgOI_U>WCBtWak54dp|M+-u&WKG zvk_Q=;1nkjBf4))hr%ZhGnpcA1tf_Go<#r)WMM)t9J)Jgf4RbPN@l*s^N>y_Mg!sC zjI{tgZDol%cv-?)M?}|>CDn-)@|q6>Od#mR;d13ce373{XNN#Gh!DCIB1fe{-d(NK z+zE1IQH2%XS0_k9UbnuY9EhsR?MdRA%3FaUu&`>ntLGO2h!N^*&YJa(ESrsKaioJh z;+)H-8-HK;M2o9 zqmR1nS;a;K@Y_TkJYU`PLpdC7m#g--)Z+Q>^qh2iRuPPa4#Q%OcJRF0#}H|J3@!p? z)BIMmcCFHy%kVuT&Q=rwmWEk_7>@D58hHDpHLAM@0F?~QkSwvo_PZDaA3h* zI)!_Yjq>gEM&6Fw|KZvb|Km4bAw3!Yk@VydDWs&2Q}Q{;TkNq8rbfufRaL5F#lnHw%jy%H{JpPjh+l)3X9f%u1zZg$o7~iK)E5RLFW9E^kgmc@r6=dkU<8f2jxn znMX+MwyEZpYWE6For)X~0=!^B5X(kwicuzFihP=Kg>~+Xc%iHF+7eP`&-T6|6)*E* zG3OUk`IdHs-E58Cu0ZT)THTdOOpLXvp*i(zk;Vgg8JZRcxfSIQ5JrSkiA_hh!15{5 z?PpjFtJOdfevU{N{*tJNdl7hqYm#jdX3~bI zZY{JIZ@vauBI0`*fmvy?R%$eUu)?BTx3O&=5c)W=h$!UXM?B}<@aTwj3#{nb%hAV< zr`qM&Ywl~i`)<#Py`KG9C4$|U?Xs8Q>$QP^kt=*#^IL!Z4TXz^GzS(n(BO-uAkgxq zu@r%#uKSJeKTg+j{U0k9I-K_gf6>SO3e(^CX>rKrS^MZcyKjEhi$D9XFC@8mL6O+` z!9lJYKYI{)bJ}i_v-y)>y_xbq*sRz2AN%XOs4jk59^GZP*Bb(Yvpnr4QEgS41 z5z`;BORcGq-?A5{m)}~M8fmMY@p!0q$T<6Pa^!g4w= ze1cerWu5GG5d9vHPQoYAM8D*D;(QfwuQ_YD77%E>@K;J%B3ISrB3O1EArrFgY0cN&+FpuY-DEfG(tN*^wwq<) zo_x{feT}ZAsS(|w6^6*VgubL=(Uw*?Y)o?hSmX!-6QRsm){50WPi-kRpuh#|w)#~ihN%rftp*?Fk$OtrEeuJze z>((8CLcTDMc&?SH5lq)oFccY=)RN2ROB73GSDF?+7rh2a64yA>G$}>B*QRW}9*<>R zi&4OfC`0*H;E3JQDEuK2M1*qiQM1kz0Wa#|JpTn;<4W_>Yqg-8-Cq=eFIDPKARLNP z)O8v4GMQ{Born)15*P%FmKrN#YF`k-YRPcaq*41F`ie4fvMxHE&TPe$Db|LR5Sv5M09z%n4c5LN72$Tl&2K}8q@4nefou|YSL9r z$E}sgBzpeHhqdegS+xSYY-ARz1fU*#L}3L5Ch(g~QFK1qgr2lU=bUjsdHVrO?e_?z zfiI&-i^pT5xK?e8zL$!55Ns7L6{4ItyWH-YZ=+35wNuP;$$1+CFX7JV4N-`R=3mFDNH(H>t66atk>wee1|Uk{X$tjwB3V9pDD zP4Qqu2yK%;<2Gu0ljXlx_Zbb>gN+bv93x*r@)Il~5DFxerm}0YDH^+6 zEI51VD+rfG+Nd3}-flwVIF>H5TTn&+$VyiLZZuuG6-xvmSPFTbI$1|FI;MWTw1W-O zYg5U%svUx?gD{FToMHWg^%!ykUQe<{uG7Q9icjRe0G)sbZ~=9!6K}Q6X;R6ObI%tU}q}h)KF-s*I zR!6jhz$XNvVf^joaSi!chD)Tk8(ZYVrxUoqpR<@t`^f@GMo&|T(}xFqVcMLomjTwpArub?A5lEeQ=6gad`?W~pGb6BA1mxS_w;TT-r4N1XK+UwX07-l4 z|Kgk9{DQy>zW&q3%X|UVxo8Ije)YDOk3HwBkJ8$Py&u!>x#ElT5C1yUAWPPrBVYW^ zdwQ?kTgiz-cN{^<@k?&n(OZpLDI#&l7gByPWij1qJ;Yt6o);r~5bEHCZ7ukXXlv>t z`U|~sm^v?)9KHoEvOWlXTC5JR9DCgEq}{5$P+9ahq9XVSzLyKFI|${)+MkQnUu*-q z*!qKj!Jz1H=J02%kGF;XUmO(u+vyR#?sCijJ#y#4NV_te-a7)ZJ-aNvg{2;QueE+k z3cfjK`l^@i9e?x7&It^8c2y;97rpjgOY5|KOp<>3xnAmWncfiygo6JXd(Y)znydYm zELZNIId%Gh=l#o59j7BP9U_S5Mw}WE7PsC}URx#O@fn&p8kZ6uG~) zdb4zG%Vc$3iWFg$YhEONDKb~J?h-z*;ByKKsohGvs=9MyYXSlKZ^Q5QH8E0aOUbUp z^YPbRNJakdaH_=vyYpcg=Nn1sI4h_)tGy2= zLA6}Dzg#Zgzj^*q{+!za>7W0N%vZR=Jj7>dgE zX>?oiy1f*Bw1rC9@2gf)vNCr!p@nq3=1vfr!up!nt9>DL`&kz2bmp^Z%hiN7R&Z-B z_dIukPWsXAR1vmxc0!2rfI!*EH~c);I3j|w2-o^G-kr6rekiyYd_S=}2Kku7Qr=r(wx2Ak>y%N34{UUGema-DES!QPh5D=y7 zo1Ud@C9S_l3Nk8_ujGdN@>3;K!Fs4bi~L=kw6eh*AJon$&d;p}npweS^K%C?g&cjg zP#_RRkQqGyss^`<1z14CL$w9$2eWsq)u14-`Tsur@1)Bd1IM7~wh%o||G_I?jPleU z%T;V4b-C>FBhc{iyf&BrJz109Pb+D^n8HuR*TMW2iFwk0IO3kNH|#t1M1jKEq$fEM@L1fA(S!1^Fs3H=>^_szR#<&RtJvMEUMR`S2xE7Hg(b1#<> zXh@R4XX?7kKY~n9wb-6? zS|g_@*5{8}U!;Xd>YD!?TKsdgay6Ur75A-L#0LQVO%e0FSTUW%DM@y57;t_Uc*x+7cI75CRUj z>mFME=J`^&ypLQRw$rAbm(ZTy0lN@d#PR1N&xuNyaKel)_Sv&#SbHDy$49<`1KYu}I`Sc&Y?!``} zvWpCxyNGPQf~MD>L(JnjlxH2Xq@1Y}9+AZ7Wk6v1J+G?;3uxLNh=Up0G%GXYZF8_f zJ4zIi`TNhh`(bORpQh$$UGe25osggUVbU*1C+=~Lw9spYtUqX^t(C*1^%TYa>4U1X zLcSAK@|_q|{b~!T)ACjIJ;(=D&tCLe3(rF@{opc;03$FTf$-L|UMo^-*H7Oo?)lsw z1R7KAZJIYX|DSIQBKoKQ`GyPpq0w!xQMD=s9VxrW;@KdeZR&IKQV^j1=7?lIN{e#d zU#^(l^MZ+m@f8Y2SoCiw=zZ2sk}+m} zk3NmQ^r}1c`Rs0GgVatcnca%#VL8Sxl`f8x|CW=s9<2s~o)g{L=X^$h5m>)43b*oTFB49m%KunG*3Mow(-Z=gC!vcyG=r%Qs6yfcABMUoxJ4vTlW5 zny@9-PW^krYZfKdIjR+nsj?1n;u?9u{}Re9r3tUc87CuTCY8!=)*VX9?a{5BR1)a| zc8^g)Zr3xCQzrgxs;P8gD{Zf-lP9vZ_2oj_)f74J)Z`p}G*K{c?;O5TuIOqT@(3Mh z|4Sv6&TI?$T_=cc5|MGAu=J;`K-1acXe(k}I`kH=1=K-vu2)n}o7TaEJQXRcrj z3sOuZJ_6Edl&fB+rdZ1n1*z{K)I_+Wil%lQCtAndau^T#T_<5dC2P7PNzXz!pr0n6 z;*uD5+8R>v`P`G~On%%Xo4XY%u!K$r{Q3k)vSnOef*h{O2rvSJivZ2a&Js`C_26o} z{xw?=@oa`;+g*mPsp$h#5l9r*$P2za zm|4v9e)*R(+Npa|AeVHglKY(z$>&mM1EYwvDcOAW#9y8{TMqe*E$@j;c)hMOMzQR5 z^+0H9a_9ag!dmrsT~Q)Sv=&cAGES5<=W|_iET3kgB$t!5?HW-#nK#CCP070)dRZIS zD`erFccjw!Z9$J?at?_hHjRSh`#>8+np(4kl?Z7>5KlXiQpr;2cIZ7@3+E}bq6tz?ZXG9CACGQJ7x#lg_Dc7sfy&XgQL`v^w3>{wlTUYSU4h&Ua{XQB!Jrj*GUk*}_<Y7aSQdaW?BZMh$Fqv$=M6<(=sq#cZnz$#uC2;+gtjkfQHK}CDpeg^- z_a~*?&&i->JBU#^=r$01%a)1IbDf4QOTyGM?q!E&?K3a(h;Ei0w9Eia@4J#@8T9+z z6C$rvk(^}atE!}*&>eYL7pqb(yE8;eg;f#hXakl;T*DQ?=hcbiswT?jvc+MKSD!&0 zSaU66P5n=&3!8x{ro;nH)<;Y;Q)@)SO-0k>0_s3Ejx5P3ku?_AF2d7Ac;Y&pD~(i2 zc`vS0HFp4sf)S(HTz(8`m@XIX$Wq1BG$ofJYp=cEDA#=8W5DTjbX@++<0EJ?NN}0j(t_mHLE~txS4L}w z`iuEe&|9~*VrN}9+{5xq<6#A4qHUK`Cm(29V^dPhOfDbMG|BLI-IE~edAdg( zSjTaOH94Ivj9X(yZTBi$xHM$5<)Ko!WVysN*M)o>G~5o%EZ`ch9Tl2L09NR)uBds8 zwZK5Qeu(>KOdtdOEo6&BAH}w$mV&bF7*az%=%@O;cLfQJ$0Ds&{0-Do+$tB3qI(;H;`)t;XtH zs-%yr|!&Bv=AuCe(ISz+GM6FsZIZJs-E+;BPVoa%UBJZsdopQOf zgfHTXW?nTK3H%0G?S{1z6Z=k$m(L1lBbR$qZcUHNF3^J7QJE+xrF2c=aGn+T4!?Q;=R|;23 zC0{7$c?PKqso zg6w3{|37eg0A3OFI@Je^?MziRCB~I<(Ph1Xfv(u$Mps1vr`IWyinR#r zooWWPb0e0B4X96x{cCCmU@0tEA-QC=Ga>}!HnS~AC=u2Gh-X2kXa6l#hFFewf%<_u zx;ld~TooiOrUjG*`Cg?nMJi_Ii;fvyM3d2oSS52{$(9hCgBAQY;4<0e3eCNg1 zH78j?D}XnmCJL!7=&2AJNWjcYMuoWM1j;b&2x%oq)*5S*Mn2i9+>%=^FHAMN!ImYp zoFHlheF1gEthjuIN?xo7aAC8PAQol{X(AR0t(1fVopw_8SwXm=$RR_z=!`-kBmH|j zB8F}Fnj@EjD^4)M*fxl}SjiiSR1ncv5*7r~F3?dG-~-V}V{Qu2*VKdcWh($rkfPR}xCgGl zBp@WK1)bOrU>hp|rT}nX?O`yaMdn<7Au*W$1`CE(7wpykDO zuC~vHx_k>u|fDn->;{LTZpgUJ81>(cJh<78@&VMBd;^;Q$>6 zOl2~0H8-zFlxFJk3)Z#;057W(i{=8@GVq0+3Pc+LAk3XqEE5?WAhE?$`dHTp(phid ziRn_Aq|&N0${EmG#x)`piE8u!JRMfMj1~!uxDN0o19%b z%3BE>wu?p~2^F$vF>s?GQJook5mY~ke&0pa<>N#RPdN%eo7f23)}l*>N&ua5;iI9p zs9wQ^wm&LBU$iQUIl+`My=glo#lu5pLf@-$M2!r+sQv0a56J-jTSq* zz3xE=loV+8G`=0cBV1MHnN=qYf9`H6be)Xr6!FxF^=tweC!#qE0t}^+H-4KP=^&_d zz&1GO?6T?up0r6lUe{qUfLpjI#iIh)cC5>jdi6aDLr|fRl;M0=fwUU8`8{(3(S}A@ ztz)>!gVl+J7caXKq`~lJ!UAbeIv9qDv|)zMXbD59x7lK2=e@>c2~~-}A_GXrTRANi zuvPu>1ePQ_+-kiArP^VrmHI^U-tcCv03DVbP!vyK`vYM}OTavG z^6>tf-N%;NKL0P#QfK}KjN5im&mzpwaZ!cxNTCByrVHma*4e+o8D5PS9mOqR_Mj~dP)ONki^}xnwzLW&@m*W+$MAc0J z5*#}LDJBcc1YnGTmeMRRpk#1StPDzdY@_?{97A+jpj)Vr+d{faL81p^x?4?@F`yp$ zyBW7)!8zMj41&&yXcF8zM2CQgF*-;EY`>yJ38jZ@(FVVq;0Cwp8!Q^207%ler$) zIZ#>eJeky~hYFw-fFlvwK;IJeB)!Y|iyO`M;3_zz1}`O-01#gEEEkYAC|6=xR5fsp znKq*294<7g_X5SyR7l0;DD?)FY7zER2D+*k2NApifvG3I0`UYvDd=6Zl5JE=fHj1= z(7fY0aML-!NF?kwJM3emah>79TppLs`!|*YJn+1+{BBXLQ9=ZmpvT$n>g;9W;TTVb z;dUn%M=**2&zxEb2ZSy~6>ThwMu}1rhHaM6av7# z&e?kqg|S_rXrTkF0t6wrU_paOz;3DHse91LWX)n>m?Ml^{TTKfKbPm}13&9A8mQCC%~yFA!ox9Ei`8u>)-%sDj5c1OKG;tU0?8e? z1|*c8buoc5f zIA<_eQ0;|xJO^$%2jHKJ1)c(m8OU{p3v+o~I`7|D4%B;C+}P&%)^2AGFmUV$rHsa0 zn_npi9%iXATb+84uo}gnV}?9|iXecYXrsX#!ioCuL5F!F5!#EyN3xJ8o{u2G(<4aa z%k8vnUv5_}>Pd&nW!!@kVSpcJua(Szbj*SJa9l~f-pB$MN+e<>Ihby-SrvGq8V>)+ zg(BiGW$HpW>Qb4Y%5>6BQ>`hpH&Q|nMkPB6cRYob9F)OzgHlJ-cQk_(5p`63={h0}G$8M$dGu_ zD+Mhr#D}fPbrX{70na|fk;A$gQ#ATj25TF{S_oi``>O=z5({0LQ4w2FX^h2#8Yr#8 za_HcGO~6w`3c7dELZQT{>LmyBLS~S(UT$TAlkNIFB|;lKc7wVFyTKs#*HUDmD^6dI zEdFmfv?(URcS$Nxr;^*o9I6-~^fDCJvsoG#_qX3C1 z0x1MlTv>Lz+$G(@Q^{an>9XEv3qi1oTcrp>(2Nf|9sow5m)F_|AO-88$s`UOqB;Wt zH%x~U+O6?)G<#YdDth(}RR-{I3epn^h3tWt3IKbc!QcihaJ!LO0rokujMK4aZU`8z za)VYbhx0+=)|xx%jr|9yw;KerC#+!(uq^Tm0U8`8Vs$a`;FQB^lj6yHkN{e6+qfD4 zC!V(VoJ+19^wFdgb_C1f3l8Y`vcL;Zs_Q^%jyz<`0nbs75@@mJtXx~^cwqqB7oE=B z7UxMoIV~ID9D&p|0#CognrUYO+DJztmayvs^I=Op3UoSI`e2EGeYe8X=BUGr>r5^d zS0T`?F0VtM|)nEjCzBDk<$)&oU~1gmBF5>CbyEFsE!jMci|^(w>fh&gBy(J3@v0`fKh zhb%q(LO=j?E@2qcB?;kX^`%RdT9A5{{GkiNbaAgxGaY9Sgd7e_zHhmB6Wk;t=*=UjTGdzZt}deg6K6u)lUo@KEO zgUKACf=dKwu;_m$0GXDAi0CsR>b?^YDnt}7-6y6#OC=Df;&TUfwiz2zB-79S_vRZ$vnq)1Ib(6mV z0R)b<9B+Js2so~`$EXs4M&(h`*iwK9;7b7<025OJ5o>^n1Nv~^rvMGfH=gtLOI}af z^;_dpcn&xHUgF0NB>FahPdxcd1#^B*%phiF&4^Y^&Oo6sRoYaUO z_-qz$xdG59G&{foje}If<%u?*1$`v~pmZLCab}_f6L0qc1mfOqcAd@fRr|J0gByj| zQ{gQIbmByEriJiiHya1>DFAmG^=dg4hpV0N>q+}+`^4AdIlyy(=fKr+fCrve%efX( z&sJd(mTbPn9=5?7jNHQpFnVcoF{@t}ksMj#%fP(5Y%>lBU{92_c?f;9IP9=PEoeOO z^f4~fF*GP8GGSZiAt@h4Zu=zA6Roq=ecKP%H9*{w2CYXCW1|EDAp@GMw9EYbwR7Nl z(!TcI@f3It@EqVd(0C5;z_anZYLO+`D=}f@wraabe-dqHIvs{F4exMgrJh{IE#?O_ zcXO3vkw4VND1V6fH=}cvbopw{p965?kd+bDl^hLB!#pm2ExxBg@@t{f9O^bS7PqOL=Fr(D?n6Uk zZ{p^BlDm>VTuE7=WNq6LG+lYmij^T&*(y zsh2TeL=nk`C53yL4D#KW_9v}M|C?TEIIatl+@Ub4x~g;(RmtE@-&li!`=M12)CZ%! zsRd32W999j1YA{E*G^*KTFoyP4XmT_bDA&?Rj|CC-Ay>{-NtHTq-dyHED`#&zj-C2 z((7%ZR=8)|yAHffI%EoQg{aZ@!FyA<@_0jIzjBJTHPA@B4fs}@Qa1$lCoORIJbR$2 zv1*$u zhj;f9j?lr?ma;A%}h)@e`)MyoAWt6yMIr|=DkSZodj8eqTDrqH;$$!x0! z1UWi#g}k&1Zv3GrFbU8EPN5K1Sna|ZJ=~Dv`5?v{jr4j;7yvRA2gsVBxqu`Z8hgOX z4P>H`cn;Wxs3b+6r^WGl$g1j^wj7DZt|hn>zzkPL8sL^H_klT%#?|@`xPb^jKMLdO z{Vs3}*cRRdRSmah1uN+S?zSkAh?rDx^AOyK)UL50I8a+x+y7gk9<1j}P5B$T6~@f> zk>|ke#sMC9-bOQeWI)OUfl#~=w$8@EL zZ=b$i|IWP^quZ@4@OkmU(D|!chh%Oqb<(j%KbQEcsGo+j8;fhByJKrwW`licOk08a zdaLI>F*uRwq%tm9=&|0fbxd2gZk2WJ-1(r@YVBdO*=qmv0uUAog$}r$HRI&Tll>lv zDDb!%HbAA@CyV3J4f$`meb~m21UbM1&)aAn&~~ciM$IV5I&+$Wb#s=@QJS*P4lSuD z-15J~48b$9WeVZZ1J74gUH->|@f`>Lly^P@Z@7$6nddCsmihLWY14X0^0G5vXFg9Y zHl=@%nl)kgybnSYnd|=)!!vy2-po)0jAN1ptdUssDR>QHw2Gdyd|Ue4Q^k(lpYyQKN~_^P8<^s`zqRq7 z^EPIt{$nTrF;9sJ~51?p~6Y zzpZMkY=F?4*b=aoCq3aiTtdU7LO)C1qkKeR0uzv9;!2 zi8|`N>dKN&k(ZM?n&XGQmz~G9)WF!2Cyhy>N{e#?l2n=o%lh&5|xrW9UB>=cRP*5t#>K2gT*|CrrPn18a}Z_f^E zef;A+S&w?xHySGx_sQ&wa_#C!iA9(4$xmJ2TEFZNwwwmESJEAMo^^b!yD7%`Vqa}N z`Q)f6f{MbGHcF@!F=q9~UYV^L8o$5s5Di05|6|nf^3u{(@oM?oXSK#xrLaCk#Fn=t z(Q#i}%`x_lT3`Kh|1LZS0^#wnwngTuaaKyGmQ%Kz$q!}p=%-=q&n1r-TU~K^S^p@- zqU0Qz zWRJMGI7%$$?$ixT$YQb31qB5UAYc{kJ0PG>|B27jSgw|%L#)=)wS!xwMx1pfm_C!w z_WxSSls!K{BM=A{ax~Dl+wF^5f4EP>rCskbR*R9nda~`hACF#1Tc9TK-?0DtZW7l| z-fx*4;NDtV=IC#;QTIBq=6j35(nWE<0`xI!@7NZH3(cV0Sr$7lEZ5sQG9HbM?rf## zoD0>W<>yur$(L)^95tz5bDV4NFIGr8>8 zx_>vrz%U68#*l!Z6KQ(_5y?SHH>JIPF!HKKB+1{CPmUMQZ{ONv z69h8=jLnQNL7=}dCO)oxPdfnX|D9$IaQz50_J@~!twhi{I2T%oMC3935&;fegSDbzTn*`8-UK_Skn3Py}yRo!sA9@y2U{h=r@%EDQEZS=x7#n z!aT5K(GToaDp8V6A2W;@N4d* z2Z6QgHXnfp(;_8od1CU0H{UG8xTv!5Q|DIXuQu3D9);VhCYgS3s3V$*Mh)klnA52Uq8u?F7&7r`bA539M>Qv*zPsRD~mtf{A1^5$QJ5@nlX>h zQP-3&-#6o)y9ccP{p`>`CJ${TuG!2 zVI7L&^Ny2yRhJ7AHNX44{R-}G55n?aC;me*KK(6yxkZ}%=969aF3?cx$siD#yIi1k zH=??3TYX>Zt3a{o=AXJH!#u60@9Og4L6Skk_!WW1?{_>J%5il5s=vc}Ngfwl)p^v~ zUrqq|eWQ{FDCHKCoV{Rd)WW0we;2LiUeh?QetJkieU)oW8JA>J7hl#~5`g!bNS zsygG0{#{mQIB`ouJ&6>4M57bSX<8zIOC_b~A=8t_SU&PN^&H5dZuSDfaOeJ4P~ueyl073l+%rn3@77N4Gyv<}L)+N>!~S7*R@z6w z2`7iSa+HK}D;#8_n=)Z)c$VQl^Hw14cYEr&8>i=A<>ptixW1IR<^*2_h`yN?H* zJgL5FVeQs`ed?aH>*v;{ywLu_^B?a#_{s-6_G>onIsB-BfQ;M2d9Ec<@x@lSgrb8B zin$`&w|}d7XGf-ni?cp#bE6-m2xosIb@DtSJ5%>3S?(LQZ0z8~Tv7h9;~rTA8gjWt zo{`fe862_QJ7cAjm9kIYo;-4ZSVZNsL;|k6Si5&y2j5$mZ-I)xS4uveFt{i4H}P-! zexN(r(D(z5hg&ag`ICM-$g7g-#QL=5;i3s6X16H1Xv3}@M7d< zH2ii@zUYnFr0;Z8OEb}d1V{My7O3Bfin!4HB@&i5tpK-n)1wp3uoPHh+Zsx#u5S&WZxwl zm%453e@=`ZKYE4~4ozj1lzxZn*3Wge~i>z_vvHaO&^d2ylXz2E?xdCnWDnbh#%4`;(9 z)^Xl(HWOdy1`|?dAiW{}L7fWMAp$RBEL8-X80Ms(-c50NTzT*O+dUo<9phFdafZ)- zb-Rz5A79gQp!P}9v~+oD&5Z-_M=A&v)ssf}>!vVN3};*#0aE=DxX$V6E8i^C6Dscy zt!Z^Dq3QTtGl?0Sw8_)}252%jyUXjIT}Xn5opxR)uLrhg31=8&9-w-LpmI+>aHSBbLm&&Qx-#<@A7W-RKnO9IGH4mLp?=zSx{RTKd5u1JMIxc-f*s= zu_Mq_fMjcVuWXjKTM~(2!iV#u?IYWrB%_#G;TWVM*c>o<@_=2(%2&G!xdJu%QWnpw zJ>S|xVg_mga3G1%c%W$SioW7-kV+0x+k4d78NJ{|;GCKi>WGBqcXq4ikZj zfM?qFE!#h+5zE+v8WPZDX7d_YcU*n0t==OkMjkm4<8T_L*5&3I1tk)t0R`nL%()a)uwVx#k_J0 zom`s(l6r_xbq>?j=3YyPlWrmnPteJQx%`$c@uUP4ybd^>XP8UleVzjiaexP&4RMIi zzi}LJff6S=rpQ4=U*Kx=)hvMUe#n#X*qNCBWW4n`^wE8_dc`?}Rs}}c!kI~lYyJhN zv;P97g<@#kMKzpcZiqHxvnW7rO194!fA`ceeO_^h6`LKDRQ=R!y;F2#QQNg0+eydj z*tTuk>DacDj&0kv%}zSDZQK5Lr*J>?Rb=jrByYM(vHXYuCEsNQIuUJ`#J2 z!kEu@qlL<>F1is~MPA_0VoR{O!54|IbDz`}M-!jdh6a9N#!Yim4bX!d`=Zj{UnWSM z&9V|w?-`G2`Z4-Da;nk=*+2a!Zgn+#X!%KLXGos0*sbo`fKgrP*wYVt_-;}*Z-Vyghi+b>zOo-aPD!!x-x|iuid?=a)d|$ zSnewHnM1H+EjQfQg6=*NZHOKu>q9m0V(aWjZ(XXoF0{5dp?vxPkK3{l!!o;OyA#lUSabyr>M86*|ZZ$$J^ORzuBm#Vn6 z5G>K9A~;daKQfeukj;4{U^h#2fIG!zf)YWF7^Dof7;UfxMu0w@ma5+2+3xoFve@cI z(A!Uq<>Y#Z#aVnT$LZ zJM_@0vWW5}vvPf``47jh(@T9Y+2}}cQ5wuYJkD8uHndwA&6GmRAo8&{)tuNp%j|)m z3wNmrEBbR;&q|rK?&qfVN9eYVC!s$)mMh=UghdH2|MJl8}0Y&#O0MZawZ5k z@m*ebcmbw^wTCj$5e;|kZVvO_h?-iK&m{NWG3v^kx0_{on&pAA@pXs#NUzm%S-H^w z31FYK#VjE;uKazI3$RsN)L_ za;1h1X>aQ2$>vF=!0>Sw;v09O-POV}^j^ikpMMidKkrl3W-xo0iqU74^Qt!If|aGg za^iBq<@-2ReuvHCX-Guuz!tt0{nMDuDCwh2`s)hvxJEfMEC8#HH-`Ur`6WCaMAH-> zKUa4u-o9hNX?b)r5Mbcu{|3Kp**|Jmgi2c3Z7`mG*ud?unMWK8>OyqgrpQiM|JZmG(?1@lk8o1M@uk^=f#Sv~nR>fNZ?hDG#Pd7B zRV}$M1cFTn6t!rHlk-;?UwF%{>Q3rECdbAMuezVNJYA4~`8G30%YKiC^Fhd#YpGz5l&vqpqG`ID{p8?$NGMsr!z_wF#8l{^>aw->B2Y`Sybu zqVc;nzjFSJhuYRzKU13D_Mxr)iKA;2R6d5dHQtXJc-qQ@n+H>1ag37mwxk)7#88-e ztF^#+oSR+&*L?0Ks9zb*mLY7e`RRZMi|rog30S$6Pip5TUFCZ?qvO!h$Qmb-Vz1V2 zFag5alc>mea{-=Q!(T(Y@l<#v)ov@75}WPbhrr0Hth>+1jKw`-bM#xlX;FcCIU{zi zp$8UY?Xx<0curgoJmc63tB}05?F&rHZOg_0_v}?C^lSLqj>mi$D&RQFOVT+tng0hP zHsSfc8(Nv)2Ih>}JH(yu75m|)+jK+Ez>56dTepsduKq*UJd(TX#mX#q`bWA~zy85?+UR;% zbdl!w{gHqqo+EFE-BV+rY`Rk=LaF7PrRJn-$)Esl4`%Cq=N58TrC`3TX$@^)g zS-ii&w6EtpjK(cClVU0}@qJq+NXWinq2>;>&oB9&PG)Th{}QW5?)IOZa~Z5R2XABV zlYyXJF=qE^kUbbYkYTS6;m35U8T_;%+6nlP4Lk#lLC1ZQyFkK}Qy1w0Hh#{0cY_2+ z@XwW34o+`wK3d?C722_=gT1+*fhwx!8_@uFc;+XCjfL&Gj|g1h)j6*%z(u-t=9_Zr zBYZI-Ix$EbiKr)zF!Y31R|LN@i@TzT z@*Oo|PDC#T$S9MxFVPTsh!?%+1uNzu-L7azs}H)>ONp2Lc;vs>RC9% z!hoqy-%U#L;Fl+F*OsXVT*f`Zs|N*ez}n|ufTjZ=IQs0G+57U=xo~Qb>Q66)I{Sh9 zP;K?yIHeF;iL_~(bmf(AV$Pk;W2nd9Wk&*@&8CJfug+@#U^?#+*3||C<9;ou|EdnnM6m| z-OI`46tMfHz@t01Ez<)oRbgvGL}DJx)k4nm#KGWy`FL&coPCl!-IvaWT&cqWa#OwV zt2=HIATX1!fnmQ5AsmC-7*a=y@A;+!1aNmqa{}6&I*&AEij40M?b~o;cx|gTm2qqA zL^UySDkhkRvSM3kf<@4DzJVq#$54EA{(VQ2HG=zZNqqyl=+9Izh6rD2hjwL8u|8EZ zxkN`6FPsdg6CKREI+>5RC}~>2OcsvX9DwF@f9BzKz66F$&bR{J!qf={X|TLDlp@Vm z{@9>u*lwK&wO}Z{5)=kD1TRR({HWVEdj zcka#oVeF=Q5<*|dR-+}wduCTb1bbZ_gsnYSgY}Tj=lcN=*;|f5%;W|-_nS`Ic&DyU zX3v~${YpX`BD);G_fOfK^T<6GAVj!9nHJb+*S#0;E1!g|{{u#ni=l=#5+Y}=j)X?t zR_=$rzw3(A|2n~(PEK#lXIM`zkGX*w_1i4$&0+=C$aXp1yul%#lI-l{>vzTj>cRWd zvooRn*HR{jp3$q5X@6<&gv80s&RLe{>((JoL~O8jpol%l_xmR~w7+fuy^{d^?9ROv z=S}L*?hD7TD~Z!BfIwnIZt3(9$^*Yk{pU#6N{KnKZEgz#Qe>c7nA+8}d*Dz%+V7!M z&%}(f6WiHI0Jy6rVrp^5iq2)nAFjU7LTcgiK!(%-MOJ?&QF<^?Oyk+r&CP}zG30If zdT$u|iDLEFkob1zd>hZ!G3N{tr0uu9j4-bG=quqXS}S@QwA-KQ$vtohMI`5*m3pSH z{RLuFs!r12bxg7KfTnKC^z%gdr(6_?JGaIV&+fI&r=!eZK#3l2e2);xqeZL$*7Cg- z@P_$9jf-ag;xniWm)zxK&acfD+d<@G-hCI9pxQ8J>C94riTJQ$D@Oj(IX)5v&grh| zOt#C)GcHQBd1v&|{d+N&S^L+{-Lu7Ni&GU=lBgKw$1b&*aA)DQrtGQ|1?mhKXSUSW z)bYcjs;Vg7`l$e^2T-4z11}2;%Ki>O*0Iki@AlvBjy_(rQA+r!YEeu@C1s5En>!D zmSwgmnf0C&A0rakY(G%cr&+7=*2psFKd6(X3|X)x1qFfY*Kt~30agbTV2rnM5M>P> z1|S#I=S0W=ct2vL@wb}P{G3N33Wsu`3docxa+dcHsguz|^KPB-EQI8t@>t;Tcx|V( zS4;SCQJ9vBKtJ9`$O*0|?^>9}&3(~R``Rucb)z30-(KR?;k?&K_hsA=&AxeU6+b;V z=;a|TqtLM^4AMe2QnR~AUbS4vMSX*nzCp0fkipG5(ZIIE;kR=Vp}hzQl+Iy+xN@amgYM^H_>00`PW*%apBacwkhH+BYQac$ zuxbpA3c=rY6Ic^66W$Is#EX{B>-+Zs#AeYFEoZy5fw%jY_ONFazrj`llGW0b3?-Ck zznG9t)EJN1Y0E^bxLgiH9^<{pj@}(W(D3x{?B&+5)_(UZ$C{60JAfV`IDby=GYop4 zw?H8yv-;lT{R9W=r=Q5gF#OtoX%x|aayQrb*eghgtRurcsOKm#b3G~h*fT0O`(uC1 z-ulVovdTot>ABsM z?g7eJQsdQnRZVxQ4+>iM_x?T#uuFgg$M5Y+x3BmmC;IbYGTscSO!)5Yb3G5YgM@pN z!jagVFMkd@rYU%Y>rrxX*;~DBKH#1Zg*`Z<7_PT|GwQn-GjDy0?|gUPcl)AnXOS1t z8+4D-`_?CM(#Lf);~K08KM+LGxcWvm;|m;K&p0u)!gnv~aF@y^w{LZsRkP3(6*Svd zeZvs#W{`JD^%U=jg<=p#4l){N2Y938?rw+cn(+ISvRd;m&pQ4@~?VhY@KP?m!Wuwn2G;9Ix|gd+!ws{OPcj zgcST*r&Cz(Zi9KgL?UL-*D zBWY?{`D#6iuq2?}_7=*L3824593$G`arF9FfeGI|Jibw0J_fP_Ut-6T_{sBeA_(L? z4vzPz5uM=Tsn4R`?YSh({J@ddcC6oYB6l?7q$x?_ZAIV~~`Z-cjwIGAcIAXJriSL*1vyFgJK|0=OMk>N;np0Oj zd)j^ROdYLl|MA9l3tCAtkmQz#I{b4bkjDyhHbK^+S3yl-y3P70CF*?Vs)1J$)4@02 z3>e{@F~$=mJ@32R^V72%19Q{UJCC54$5G5&fWuE88pG2g!$xPeC-Kr|>Bq&zd56ti zjWuymenSY!T@&-z{np-kpc_*v%ZXUvlNfH5vhRH9IF~{hJkG%h2~_mh>yLq0r`%br z0xr3R)pR~&!+k!mY>t+(xH7+S3nM;Aq*lAtul}y+^ePsIlMmHupK80R<8jTZn3eA; zO{ayv8XqB3vydbvY|N-s*rq49BK)*G(DrhF$1?r3xLaPe%`MJLeK-^4S}9&GS+65Q zAxY6wCSa?eNl6Y1ODVgKhL?Fal=&Z-DBt-r>yo*Rq(8QyWjnkm(n$Px?s>lhju)Qo zf-J9DMfk=5i8TS{V}Wk|64NdH9xvHG;0{*C<#HkqE6f)1Rb%L%I)2 z^ZkgId(DnaR%?Z`S}Qq!ga3#1XhBjt3AAGGANcCGWv}Ih)tOcn^Gp|A`#gR^QcbyB<&P^|=6(Y@+EK zNMKI$A5ZMKC2)+xtpA9h)fa>i#p4ghP6>v6IiL_}cCdqr1=cLk8IA$#p^4y$WVQZNI~w5#ZFw>2f$oCqUgZV8=_x*fxPus14kgh=85Mu{ zrEhygCME%M^;Nsm_8yr$mSN-+%*0QQ-2SV!8bVKiMG_)g1K7}wS@SGm40131`ML>E zkM@Y8dDDCGsH5+m3rH6RXb1k|OIVM}p}nBBrQ}7Dpnte#J_&fZuL4rVB({8tcsdQA zj_Y>|C;?Mfe0G?B&%GvdiBSX`bP=*<9@nYbd@o@W2;B zj>1)RGXlDtTMP4X*XMm>t|2R+e`hcOS;JZA1KT0dnT5-JUHcGP;tc@mk_5YRA@)V2jaaE zqOx~$$B_|*U_wlieqCM9$(%n7xaK}ysV>9qE}(>N&+#>F6jdVV>|P?ZZpL*v?OgEH zp9?OzA7QG`$^YFc`n$KX>hQ|Qysm5S zYe*+ywK$Mbb!qi;NOCNTh2ki3C|86n0E)y}=x&r!sg9VmUfJjb(ZfP-18ilWTUyHj zztz4{qg;O{L#}AAH;Q>1xI~o%122m71>j>ncQ-oNoz2Nwyl<^Gd2JKd(MC6mBS=*> z>2Ni}1DDZ}+*!ye9Y!{2P=J5z5ZXEOJnTy41wU-*q7!I9oJU?1swYSU)zYsAL|3Lkh8 zOijWW+@|qBc3rp9M*_S!PYnq`kRmI)mlmTJOFD&<4&cb~>?SnYQc>M}V*8eH_`dOh z4Lr*qvMC8AqvAC&JdC}-Yps2h(JmoU8N`M!xK8z~O--qxP$91^X~=BdFO{QYXD#E? z<4L*@-v0Iz!XK-Ec5(d`E6(ny9-`F9-Fn>cGv#q>9aBoaQ{Vs|ZJcKfG1FPCOjoX< zyT1Py!#=mqv&dy?ooai{0fD3l1{$IxLT8?3y4h_4FGgaTip^6Ca-45FL_ccxRKU6B z-9PMfL)%<+IL{f3mD=Ze8Uoq=fwL_{Fu{ciiHki@M^Db-^8#c`-wPb7!;lN|$)SI^ zVUeNBg!WTx?826^j2jX3%3BfL$V^3zC|0;z&@Elni)0_trAFkF3tU1y^?A(neq)X} zE~S0k6U>^4wG3{?*w!_5nKwal?k2P`k%p5ot)*6hD`32lJ1DGELJ<7I2hyGi1L{^4 z%wsvO&>WIl)20l!@)|~I^FRKS+7ViglWLq|swUFH4A1OdUU!>IkHH!!Z(ECkyz5zA zO=uVupbYS_Id#)X+-9qTFpJ#pGf@pA)LlxT9-oPCEt4SU-e8W87()Y*odvz>bCwxbhEju=i+7OpzTO&kH;d}^I!hDR`@>>qMmpDqSPFl^2;P?m)3@_K7Kkm4 z_+ZL&JJlHhkd#KiN|^rkC&c5D5?j^^1_!@UED7g8yWp>XLxI> zaqJ32c?G}JIQlKe}GG%+vZe@VtIECxUP`UQf}hcZ@!MQ z3m;+Rug}K)TSUey+Q}vzK4u{0>ClcQGBqFK;m=)ARTBJh?reWt?{aCHkl78y3WJYo z(8=HL0!DzpHaYqkSVGjSRxoF;5&C5!JZO^%Xc9@drk?nk(sP#U?*;q*YOl`B@pTB# zVu(0BM~5lIrldylvL)!C{^+DhU;6^Gh`e&Zgy+$MSMl!_*9FV(JQ6 zkFGJxH09#v{w_-a+XrTR7FVOGeLQWq$!4@}w_ug`Ensk$EJGSES1%TE4|Xx;&}`~E34M>s4MYxjdOh*8Qh8YgpPjax+^Ydg z0EO6pehq5kcIfH))ek=wO?ytg6kq-~$==C#6-?>5d%4fCxcz|k0Ejx0j&$)cqNUEr zM?GO%I3;Dap^i6?2GKV{ahRlJ;1U=r83Jk3{V?C%*}<*k{4E2j6qXs;qsD&K>8mWG zSiNI4uv~;$))%EZ^>tqA`8YLHJngw(HvU#&)ll5AC)+u*laa& zg`q5`RmM|l(=%pp?lmBt6`Bjht=@8V66pD7-kxY;ciNNzMxBlwK{3C%=s9%GD|gHF zoXVgymW_!5rVO^$yN<4M=KI%@l=T|iPB!>VT1-i277tpSWT2-?676{&nxxR~Gbv%I zbVcttZP&-(YF9(lw<&s34;RsHb|23@<2U@osd?PP@^`d7?-9V42Vk;45ERDsr3}9{ zj=EA|z8SkZ@i-J71|zzLV+u|6;~RJeanESv6WJP#?nyoITy_V?8Ic?J?n(7La{vzN zuT_A9>UGG{@~4D0w8Y7uD2u(q3IS%$LgJ6ibKrcVNelkU)&3o0OlV5oggsD0_*q7) z{<`BwAZSL`*|U0^ZLWq1${$7HA0bKNQC9!Qdc zfBu!@BhNj8Im?W=Y&M_g5xWcK$kF7rfDIT`tVh66cp;8?l+}*!8&tY1gX2{P7o>Ju zNAzQ8Al~FJn|@24N8d2>ze3RvGO`BLd%J~HocS2yET;RxYewJ(5HKu48&!!DMUR;kgTGwp@|ZC6Ri}s zQkq?zkWU)#0<7y~lnhI=1e*GV@2vB!``AW7q|Oe%0a3=H0G)OU&&5~`Sk!&XUi=f| zd!4*_)u~Oo;ZII|pcHB^VnOnjRV2H1UkBg3yMQ}DUp6H6KFg%m0#}n_7m?wn;<{6E|i zI&PmC#kCd#qyTqh*&Dceqj|(WXcdfivwdc1ZIYyQ_e4{?LEZ641pTB26614sP4enDa&Ye7q?>I<0WLYQT%=*F;`eTMCUS zuVi%GyO=R0L(AK8ZoUN=wVRo};B*At(?m=t6cEN<7Cv`7^cI2Ak-$i%qfe z4O;(x3K+ybsQ%x0VWMN-wYFzs%K+*==T0oB{bC`wfSDI7>;BXVH&-T9awz-$gv{Ap z`!tmTzMxsxMB7PY_vvjWiXVzj6O{5%^jX2J>efr&P`>*;B5lEA&z)Urlg&9B?rPE# z>Lm}I4RLPirx4&*4XjkM9L=`TR<9SW(NYO5BkD+^9ToeWw7$>vJOoTFqSQpAGEKSf z=}U{W?$&IjtENDIkB!=5_pP?yg);vd5#}WM$MrhO`1A1?JM*CO-<1cj1v36^Wh>L4 z@;h1_3s`kr;snUx@n78#bC4iEan}d+(<)4xiRtV&@R{#{ORFG4a8Y@JWsG>eZJ`!+dB;?nm|eW)QB?WQY55r?mnJ3Hjr?h^EXai_xN7 zm->p!i5LGdt;UVF%GWJ(?a25f=W$hqJ$4HnK_nB;os7)W^nUE)yVNg6z8JS3!QrE8 zes1!9!2PS{ZTmU~OYjZKPiaxnmnnP% z&a6Qd#Un08epfy!V=IBQaK&oUQQ}KQrj5_l`oeo6K3^SdpF!Kc z)#IFdylj5A08peLYV+HH^=O)Z^{Uk@w3+YgHm6Fwdt4g}BMS4SFSA~?;psUQ1 z&+4!cq>8rOGe&tKL(`|S|7IW7r73;QFjXFwocU_>{w?dVat0tr|E=3E*-Gwe_!)Y# zbN`~Z^m=Z>G6njDGL~?^GG-I3&ud?ni@c{aRwX(U&Ju-;hY=JO-MIiD;K;J^VN2zm z`*8r0SM61fck9-~!!VOQb)iB|j~+jOCb|JIQUA*m4H}^7e|8w>tu;Pkzdr77m^mvg ztJ(LO3(gHe{wBCrRUOj%A^Csg570|)RS7@sT$2f+v8qY2X+#*OEpZu}j`?=$V6f%r z-GwH!qC_Ri0twlOnyX&#@d#b=*iEZ5#Q0~=n!x`$IhC{wOH^WMH@dFJ%XQYlEnHZA zwj1C!lV>?LNz=22hg#Ig!`%s2NlNTV{H~TT{!`n&FFdr_HD_EzO%N)q=vQhD;`<=Y z=b0nFpCkw0@Hzsi=6ADJgp5WoR1yy(hh05>ymMJTKt<=37{5A&pB79%e_P!^wJV4e&5v(Mezw|M^m`ncVQ zOK|jGe?ip)0XRUkwm;OG@_b=PNvw5LJTe_@K7EPEn%ZfeIyt>Q-GdReIP2q= z+Kqo-JCu!Zt`K#2t*T3R<8sYUatIs-ddlxYSp zo9(`Y3SgTcXN$%T-R@w;JjmHne$z8ucUwOjoBJ=>!K)$C1pJ_SCXX+}al{;No#(jIW^X&sYk z_V-1|?yYEUXt)9RNs&L=igoS&0x3-ZX`B^zq7)>{boBDH2f3aPT%J7A_+tyv)P(Yq z76IMllTmO*ATJ~V-xx}~!w5+IlbVM>pNGuJt7ls`zd0n%%^e>mJ_{M?0Kv}Tmzall z@dVW<5z+L8G1B942Kgd5{%8+aW}D*q1W&+B+{4oELFfM=NbbtR>&Ljt{zR^~z~HTX z%e{}JU2oFMbSf>6=?b19yut(3jqu3*o=9F#@8BPG+^#b*f+RnRxQoR*o{Lv!0}6A; zv^MlC_|!M@l1*>DN|RUhuVuGhYo)wR18R-F<+~<~DC0cZ0^lp^S!|94`{v4w*{qmi z{x}r+X6jN%(A59oXP~gLwKQd@7yB@G3Kuc05Etm?o{w(vM8!LdxVmU|n&OZgCjYp% z2|eb##0B^?^EU|aXc#-F+Tm%{TuVf{U=Qp_?GGcIM;*3Px8^J>e4nfC zp#Hl;0NM~HICszxSnlQSHaq2Tfpn)M^UkrDewGkYsO_k|8aHvB4ScH(iA=;yrfyJ_ zlUs8Gj>^eBfRq}+31J9c3)>{yTC>aPL8OFspH$?Psv@E4{Us)3c{0T$u4O%(p3H}& z#HFhjni6N2`E0wge2?bc-XS@Jo$IpT=pi6lvZkCo;K!576Enlw-br;SSg}ndGye6q zxiiuctTkdMM6}aV{W%>z%53V)kUPy&*a$_C%hA>u2#mybmv&GvsOI#IgX4Pbl;Z5$ zyN_i7v8(v2rIhD>XF&5Ay8uHvw?4?&wg&vR{GH5y$_V|8=Sy$W`^``(Rq(phRQ~4b zDK7QsPjJceSU2c{@V3NcQ3#?RM6zrG z?MAx)e!B@c9RShaTE{dxg1!gMVGOH1yMz58F*J97SsUx`6tpEdQ6USg`L*Y@>YqSciG@P7-W967C5p|1wC{W*Z6-cYk71}}_70v?Cq6AzvVskes)y!pzetKI z;^YO7L@!L9H+C(5^K@D3A}!_f$c-r5?2%<+Y5wln+e=Z0Fy&E1M(zb_UB^qQNYcdf zeg9qgKJ+3u&t9eHgYJUkAdSBR|JqaK<~2N3RwaTzaw^?$sD2qAMX=DGP`R$s6J=-_ zY^^SY_NcJix5#UG8Kp<<1T)=!Hbyan4`i{~C<$%V;@y6H$sDeXW)4%iK_q9&Li4M3 zK4Rx#7nI2Guh*apMR)_3;W?Urm>EI(z4$LVKm>U~{j2;%o^DU=@gG)_xb+{b1hji% zxanMTnoJqAtYmcKg09x9gdA8wuHj(l*IJKIIgZ9Up3qX1k{~!uAJA0e^`q!(4$4f2 zNKMmsbMvOq>KX~(5Wvj=T+dAV0&pN`GWs=M>D-J0sD~e^Pwgul3<83&g5}YhU`QMV9!n?bmmRG~n)qW+>W~C>! z9qCh|a({v^nZZ?ezI=3AIl{%c0pF#_on<=%3A7))q+BDF`MOjcTmI7PwsDF{?M>n4 z+T$S5YneX>4>9zZl0!ki*#&vbt=G&-@UCsIWS~gmlem@q@1*G|ZdoLUt*6@y!Uht; z4*Gk-#>z+XpZb@D%9RX^o0mm3%xGA6 z`vF}3ylQd1E@mh87FzpLAf_ncm{7$Bd&k!T(VV+wL0)R|qUQ$jFdHij+i~A@GyeQ8 z-FzJtxI=O{-#Ed~0R}JCg<}iNi!}oH1e(&Gd>({HdQEKR(DZ8FH*sx>bkBhu$h6Xg zw-OlYuZ@N>Z4Y-m1@NXyu!6z+HRfsV^%Bf(iH7rV?n!B$cOmFMZ-qbZXz58F_3npu z^kNuJ>@ec+eVgAl8%yHYJu6a$!SC59ZM1nx`WPw z<A3?3EJ&_EV5t6>Xd5qf8$%DQbwDM9i~FY|2f6)^j=Xqv z!lvfP^Q^KCQf*N%N0)NJG)Vb?SK0uB52Z{i=J`)e_Ogf{Mey+>?as!3U4wCdFh_fY z5?`NJ4-%gqa=`!cd#VAWtFZje<$kY2fTH-#L_(Jy;T7;6u^wk(ev-HVLp9cGnr=!z zvdo;yHzOe+kMs12+En@Gd&*+-~iSPCauPL;Kn7zP6cr)%ih}4cXKEp^u6< zt!5iyQy?1on>|Xe&6qxtJAX|uBHxi zy|Gw4Ga2}(W=OvPkNXA`(mA>m#i8No@Q{|>d8{@^$oJsSI4{fYs;dmLA`YdCiV++H zR(5#XtQc?jUQmn&Xc0^a^wGmKQDNR>++(W9Oe#k(NoW7C>l?QU_6=3QTd)2dVwJ`KMa(KT9 zOW5lVU;|zJ1Ybj%mhm@-OV$Ug>z&i?o{;}ePm^Z{HM{*-uT{)0Tr!X2G$Lm`lKAbd zkUig&A2Wy^nVGUTs7xIWU)VF4;~-frWM_}&fhQUhdi^S1DS4jx1C=CJEV6v_4Cxo~ ztOfxoljUr8ribkn@j8Y!HU_7mQ&qBDTs@uWUo{+TZG7_~iG2f?W=Y&5ME<4bqywpT zOA6^HOgGA&FXMCB+SuCauX-{|T2Q>wXGtPw0us{t0(H>Bw>t~ImZ_j%o(x3Y zDK5EE?RS@MD3+q`r3ZXATiRNe4}(*tM@+DP4?ZNwg5&=FuZbIHATSP|1N<|s2`8iV z>`_M`N-X3x77&u%EC&Ykj2D-ZYxU9;xe}U@%1j-7Ul&QTA;P}@JUcH?49qz(+v1ZH zKVjQrZ>Y!*AqL`XYU=snpY|QR+sOu~nz4cnB=`fM;Npg1xlJ%@xx>3cPMc`@bDtx2 zaVLpc&>j!x4>5BEcNCHO*0B^69T=6UlA#Dnmk5=t*>KuBI*4|K>1Nr(pq0Y}^Wcg4 zC~|D-lySC5P?E2vktu61H*6LydMOyB0UxyF8O&us0oR4}hS4K8h}ZOZdp)K(Lj(*H z3Q%YH`ue`$|IUaN?P>;oA|FhN#wLjtBc`IE5!vZn_-jA}2LcD;@>Ag+M@?OltoHI} z-eSH|mGhlfXL5_zQt_UGHN$p*Vt|iaWCmh0uX{Q=BNPKv69U+RCF|KjxiW1rYEfyj z+zl<>guADQNB+fywb*SFSO_#T)IuOoq5Bf(Ok&*S+_LcKqbcJ%Pj1kZ>Dphw5-Pv~ zH?CSMp9cMYkRiX+Ry%TRhdN`55%d?#+l68n7KIBf zPa{Do2F=3NpDIbZk+gPV^{vF{A=zrA8R+B+hHlmaJHsEBPVLzh)DODhSeKyA+R+Xn zD3yV;g9uoP0%G1@&G5QbG+926;~I~$K?-pIYBU>Tf3LP+x8lKUA<_nc*Yrv>vvxSIR{@v@Otqa*dS%up#--;~5gsq5yIk6#Z?=i{D5CwLkh1TaK^TDZWU3dKsa zY~&6LB>!_}Sl#4h7h95?Kc_bx`UuN;#AEYKLa9h@F49^1uXEDM#|_esY?#n7zopMa zxD)7FyePd7>?BID)@rlqOi!=Iy-a1WU4I)fxuV}Tjb@_Go6g$MD{(`LONm_)J*-Kf zTPRFijh?bQ>}z5jEEnKpti|+v*>@OUp!etnr;1Mg-HvWH-rPE%5;a9nfgHVWH9%nk z&TK1XLcN0ZDl4(2IKdjC9orZ`jyu&xEQxaGvs}_hg=~E$G8W=r5cc|7Yp%(H9nqtw zrG493?JFJ0jyEas*V|r|Z8e_UT96MwC;z@O;NW+0)d=&5E_FDX+oWWR#cEhSIvm%3 z9+#Sap_q|$du{2T3@xV8WgM30y-2Q3m7mU`^hi`e`vXj;W1J-VcmRjj_>+^I=&gEd zqbkX{&FNESW|ArJ=V$n#*K6nY7q6k!dKRG(38)7C_wppFj#`|7N z(INgiAhDiG)mKYR1`>YC2yTS1%UBASD|V0JF=R?DwJ+ehQF}X6tALS3`%2|# z`PDiCc}+&B7YP?jK~1T}y*BMJ6)&{^?oXUMqqpTrQBA;mkMjd(T{bm6qyMKYOag#0 z=IR$>)5pc2^VZdQd(Li+>#@IR5l(#*6Q91S9vjykW=?uOi2PtnQQVei&bV))v)>z* zZpZ-iCr0ILR@J)tNZ&p#n%!Z6`@jdw8PS8V)KHUnx^Kv zP!qrPK&~p62202Dn5|p=9M#Dp&=_)%HAp=A^>@9|YB^qsj$PV{C}hy_#cunWi^$F9 z8(Px7ER-UtUVL3c?TCz?+AA^Iq>FG|0t#;+o(T zbd>!^R@)}yCxjMSIm{XkV#`}+4I?)#=fc9cY9i1|#TsM`^`cV&e=J-MaFo#yw~LScuFzR=T!d3k zX5Y-RLx}}vn^&vTf^~_Jqm)z$+P3cI%7#zw=&wi?@wZ6}S*CXIH~*xqSu z+qP}n#*UqnKF|ApW1MrovHo9UEZys#^LJg>+)3nriQ8Zh3y273t0{+>j95x^4ssEH zJ+ZHNo;f-M$ZqRlnZl2GPr7y1hqR9Z zr&j-LY_Xi`Y7Q&4pO%F<`|-ZUaHF$QUvcQ#K_A()XO@Dfrg|o=;`Z{@aBi;}aya*y zR^aAdSI3EA^JUSsYV292;WR0$kLcC%qwu`#F@aBLa%MZYb$QIxv>Hws%&>`S9c%n~ zrG;PMU7AsSOsLs_`zh_G{%bc~ColK@h7${(UxTpkxnD!1kn!a03!;54I%jb(*&)19g<>Ey4!DZ+}a z@jeec^g~XiYC0L^EDx@#6dr~#5Jg*SFBPO#RWY6j_)VE#qi(zI`CK@~dVb4AG~nrV z4Mrei9*vUlWGOU*2jucjy}B`be2+83x_hH!d~@~#weW-7tDL)QyCj#&LMOA07RzB{>NlBVJJrM6&Za z+#oGYtx|{1ppG!}lb=|D`!>-RD$Rv3LO5kYO7OWbm9O4enTu6~euTTam_ACZnismZ ziPMt2)Hd5=7~~Ayez+S^mTV!N*F+`5NqE%jN&XON(W1&6p&Co_ivqI2wuZYAx!N3Z+c{&;a>m#* zV9S$4eoiE}LN|Xr+e4l0Bo#SiwB7R-uueg;ES21oyYp0pD^WxRaY59T)QO>D@p=@L zlbU^eRJJ~xO<(Kog2lVWzm)0^wPJ(}s&mg3+4E^WG`2H`OB3~hH>fE~!re@|4Y;fB z1LM3xB`BWFDa#{a5t>KGTmI^+A;Xjml-7Mp>UA|H(JwgB!Idgu3X8O~bvB`7aGjeN z1*({uDWk}}6^fnRQon4_eq9smdrpw=p|y1Jb}`BoG1G{KM7P9ZFHweopOvO4cNW3q zDF>TR{!cx0N8EJ=Duc=5NFOJ;>fs25_n|)8V$}-4c8jhE3f|v_3&C6Osu7DIKE&rqQE=# z`tW}4(+H>&0n4+L*XQYl=+O)4A>}D&7Kk>^{B3+Rr?KFjYQ4yo%$>EE+lw-VdUl>I z^H)fiUA@y47c^5O9E;w_;9+;USz962+T_ke!^B$Y$t1$kn01yh_VPwbF&CKc-lkE> zdp56f!mVN!jPyO81bcbXU~iKXZ`AYc!Vs z)?Vg0>Vp(CLtkoy6va_j-T=Gs@W;3mIURc8Y`*s{yt8?*Qb`e{8D zb$;UlY^g=A?qd_Q_BpA8o7tJ$rNg>Yeet1p6T6IU!ShKvb$}H7R9Yx7*973U^$r}k zcB`KUT~&vYsY@$;6A83p!wVQ;rj}e=-cnZg zkNIH~qEJIJ2_YTuCuRYE%oU4pVpmXDJUA-Bn{Wri&opIQp935l@+D8WWhwWtzf!2&uTlC~rI%hvC9#b|T}^8X61Wtn+# zFFNeMiP;<1#48)%|F)CtEl#w9k4>-e^fj zv)_DH_V|xtX0i(Lr_IArjT_V`Op)9=FdX8av_3Sjif??fm4k8wqQTq+X)OR*d zWX@ee);D6|#onRP7>RP~PBbGWFTugJk@d`IHE5K&^@rMWX=MU{^LRbMDFc;C#kdGV zbPKgb=WLi_u&?g{iA@q*iQre((h`#n3x~7PRF6P-OO=tH&lS{S6!v?Vxz5EpbY0|Z z|Ll^x-v|FC=;FyCqj2zhv`8lR`|^gdUJ*_Obc|abDSk!jyAMlJypYK$upB$A8stwW zY)0Hh4vTV)Xak53LsB&pmvx^+Vp_zB`EtpWc7zm0V^NTA702@G_pHM7eu&pL6`oUt z*~s70*;n3)L@U}L-elxQZZg_gRey$HnC;42oA6-Z`f>t)_1Y@iWT&u8Z*ydmEthevJO8gFz@z<{iZ?G80bnm}q_KWgA2-j;aiI^$1q{#lm zf%1mWTf6#t+`Hk=!mi728&pH@&)roce;uU8UB$^Laai|P9p2DBlb5s~2v5;7dWq?I zAZuY6ZM|un=sUNY@6e?C^BGtd&L+pMPgEGG{oZ(qN|B4LP`m?q?};>0*2*{p6i3di zrnVYb(t;6K5H}qCE!hY}cvdLJ{&6VH%cIvPaazO&u@S7-9xzYOHU|Y0<|J11+{r#3 zR5yS49#{zWo>QN=XsuzSEm!}JYLnBJ`_*Hfnua3c#4q=aVfF;?-+N&{7UxCzif}|2 zSFM62Pe2=)%)LGCn`=EHaA}+dfBfC-64>(NQtP(G;BvI{6=mlB;J4TN%~8w-Y7odB zU}#{a+x1nR5fZI^KApW(;EDD`{i8B`GN%4TcMGXdJC?i%J0%QT;?JBC6Ab`^>^Rd+ zmUjP#xO_U;{v{ATM`ioPrnkC$pyuw|Pnvz!?yM>Cc{913q;*TEdaY#UJ{-suV(>YL zDx`*ROJy=t;PPi7`d{++WC+eep0R3xj&& zCK6_Z(fQUZyq=kFhFv#H``n#Ujh_1J+K2o4r=qOfLi~U|@`XfpTZM zl;zyt28ATz=d`hZOhF2+rLi`{Fv^JS+_O{7oMJzH41HBcI4|& zEtz_!4)qSUt{RKT>)!saAEq0lZWGHf;x}d2r$@>R2&I`=NvJw3viy0HR zDB4JHTK4;^6j|}dXR#;ix&@RN0-+GrX_?9Q4mSn)iuk$hoL>9sIQDy39lrNI+c{BT z-s-i+b)t(ue(m)QuJ?b=q84pE2tevct$#*BNo8~FZ&`u&BF>5`6FFMXeVakA&f#Ei zA0nvA8tnpZZ4N}>aUn73XtZr{g<=Ojlvb+{1I`;OSgXo>L6a=PBjCeb48WR;L1+_c zo2`OboX^hBDiKPI{rcwpz}dUnk|V=kpwzleBptUxULf5?->0G( zX5XGRz|p#Dn$TqwE6RK;sfppnKbX>}my-afQhccJ#KS$@#W+z|wd=UN2%^(OQb+ZB zcd5W14e!l-ll@~Km^0Wl6JmHNw!PckC5dYGr~D-wtC~{&vqGVSP9S;cBM~aoq0Zir zO|p>_ot zbcL7u$El~gCsj|n&eAD)>$H>7P2DF;OG}f7i#cBN`FA;bqJHF2%|vLp82Lis*M)MO zBLC}e>>E;l0ADP}w|S6t=LZSs9Dfj*y~AD|3fH-@P_4Tr9leXEFM| z;g%zTy{3XiXPODp7jHMI3iw*lBm$2Ux3zybdX&R3>J8Nhq>I0}&`4xCi*SF8>}CW& zY8g-J>Pb`0m4jky~CE z7*Pt9i?q5Q@GtkS3uZvA3r=L);r4VKeNH^D z)3~k9H*Tihs6+XxV>ntjNJ-!OS2zpvUvIy>YL-yWgp2JxBZ(#4;XdQktJB%MBXdKD zD91!<*{@Dnrds=Zo5?xa;wqIq0EXUmeZMn^pC$ljka!9g)eU0PA|bWK9-?P4x;&lL z2)=o@&$~={-lN$X$=1-s`Gzu`iEf*L!eO!UNr~N1AFiwGiETr=*&j zaf3*TxK>!f!Y*YESGFn=OLcAdtKjbbE%UJBbO{nqwC?ej!l;>WO!YI{x^das6=ZO; zr$EN`_BB#TFoo30Y1grMWK>eK*Ol|1o~(ZtWKMs>eaHES7m!4JmH6-=Rdi^75MR3Q zz~q5lhMHJ@#b?^(t`N=)t= z7>_-cx6aZ(INNP@v`_T>I-JPA_gK&h8UA-|RiR&u=k3se92r9c(o}z;tDA<35k9B# zX)$yf-Z+9&3Vz7Tz*tOEW*Dr8+_ZXE16<)MVZk!@zqWjrda(#{!QT(lQxN@*wlLz2EhW}rd}We4EM zX~Wr;%A6+;&KyExU{v<5Ya7a`Eq7WTyXIuFCN=L^jG@o$%d+Zx12fYu4Ft0%IFmFP z6F;(|ypYaJHo1enkNy1RQk`xZ(3?(Nb_1er7g{ zP8zP)nA&@OxVi@r;TP|Rh}bz*b=ZgSZC0dTe)mESqol95Uu}qdo-({TjwZYJ%r)I{ zfOikjGSpKbc6d%z%?2$T%ccou6{9)~5ls|W;fo%Ue4RQ~oQUH4xDN-fg_QHqHs9Uz z>urO2070UT|N>i{u=w;(#+qP$gp-*-XH&5C!J zE;rzMdjmo~zuXrs4cUXOq~1TKn-qG;Hp30_1C6BIg%^*h{wN>N9mcP7z53mpQu9DR z@`7!MqvP%QK?&>*X9=sFK-TQQM%Z}R&fBec-?9eZIm($Gn%S%7zYk0qdUu>1E4LU2 zQ7G@OH{OD|Vs=kflExHFa;csi?4GO5OIsI{19}ypHw($P0!EcgzOOgAK|QX|levpU zmt2Os^cw}hVM2b7pjrJ6QxD@2?S)?fRXcNLD8ljuuH8?qH@D;ld8=6KslafJA0am; zHC#0i)dBLx0BFAg@vYEwOe-s59dv$WLvqAG9-x*Txs6u@lm`HaR(kL}YHYDJDM%Do zlD=A=cNhJSU&uis9zo=A{ep6%vXXmPe5s_?+7a+4o>%uCpRr|vMsfc?R0c3B=gE0- z0JPipW49l9c#S<%3cJ*Y*%+)*nn#ib)<}{b{+NzZNB^%!f|-q0)7bd~Y!SXr=FAdAk;zYDfil{F*Jw;AjbGqD0aFWo-&o$ZrHL zM;6ZCvfB)!R|A?2PHKp)#0fiQ_xZNHpLsWK(fIKD-ER)ETLe%f=9#Tb@%cYWp6BWj zvC~spo}^qz=+fVZOl!Qr0iL?=eXWjBBn)I?IzN1qK{ny-+UBW}w_7hS1b3e^q~|f` zt1phfOmyvIYKAGDys3ujEQpQf;cnAcUby?!IRDu6(I=~ol#n!i7hx1(v7qFesx~(+ z`0A9pi6f~DY0qfZBjrrqAkkRu$ZlS!Md6BOK|^nV_WSG+4nr|@gjVm}@rl;fkGG?t z`VW7{syB=XTKZ{OHU3k&tz=k-b(yXTC5qf^617kN9brpmndO;wt!&h>)Nd}>KMU80 zF?Nnd6!w$%7sYplAS3Q@Z;|I~n&@8*=qB0b%!b7Tz~xh?tb_*jhqJKr%pDHz-`4JP zg&X-b{e%V?Cb_$GrIgtrN{`ow;^#Ky>#MYT2X*i?I3%g~U`d7>fp$hfWCK>a{iTpO zODz;{W#_sPiw29mv}3d!Vpk$F;@*-lw~5&wTYZt{j!mEnJ=4U>OGt(kfsR=^K-(VO zPdo*0UM^D%5{ltQBT|^X(VBbYD@Q$tYQ;O|q&etI*_NRm_p@YdiMO5w>w+$uN^F$= z4|AbwysPhNL6@Pw7ib1|RTTOwZxOFPSjc>m!l$RSqGfXqdA^Zid1d}K8OSrF;-Y-J z8h@M1AQf(5**Tj+0H4{bpn{7HspM{_0L4N6h~I*#{12@GJaC1xQU5QmF@3sTe5;vZ z6@Yi1(d)2vxG~&jfUc7D8nIPvI2dSd72!Co>9&A9y0Fx}osKSErAyU1j_pI(6_p7P zXYD9l#~CLS)Z7pj@}@iD|LM<=QgzFZx9K8B8&))kfQ@6S#Lq1{Xd^j+6Z)We-^S`< za@>6B>b zGQaBq@8=`5DgIU%o9d>JGEHod+8yGN(a}hwg4kZb4i~W*F|hRnlb~5k%zEfgwuh6S zrY|~$paD={hN~AjW6bRlWfLP-_MORS&?;V@2OqmBKDx%$pKjB-Y1(dJB9fL3NeRLXsE{W94HzW53S=UnADQaxI0(pYpEFVoxUM&a0h;xlMSt5Q<*3+)0rM zL3EN=;Q7NL=L266b0*gN!7Glah5N>xS1Z>S`#>-Ypx&wT-MrMs@g}}3o*{88`cfl( z#%GCWBW8);b}g`LmevTcANftas*H>w?@$M>O|%&VERCMn9U82Ow=C7~9HAq_ zlzj0R>%ry_%lH8FU@e!nU73FAia04&Krk}NT*t5R@BW5%}7{~sJO|}9t zEHq}gd!`I_RPrRIYvW&1uW~~k-G!9Pkm{DMz^6l| zSI&JTIo55Zd81;gmr@x=j+3OcA;Co1QI}`L@WrPH3GZl+s)@(G#|-~voWV#-y)-Cp z0|JdjL`Z?Z*3UR^gt znZWoY3`nc(AN-C@+M}w1t2pwO0?Xj1Fwy2;wl+KCT_5>whW<7mM|2g}xzKCBF^=}D z$8)M2o?^U}ckal7gt`O9lxHP};;IWF_h zJY{7P_v7mTyge_9P&yf|B@|E;IK|4h?MCl)c?y%YegebFT!&g#yG(bxwNW6OQ6K~o zMPT4%t<9dMk_H2HC15f0Nu?s zrVGd8n64PyDWzTv!bwVeI^d?kJANoJnY;1lYko!Si&_knFwOVB8TT8yjvi%(=KYC{ z`Pp231(QU9WNipr+xKH?ja%o1`+h{1@+&vSJC32af5ycc8EPQpV>Qy4!CAO&_wfo&G`al;t$YW&Gw*#? zCc;rrMjuN=v23W>B3d8mwpL@f zlh+HeboVohe?3Bt2+-%^(C;BeE=tg;-)6z3hB|7e@j{^d{>T@z86IZ9h>@p%XMPgn zF30Tf>Y9VvV?*TLmA5+WA91WpgOf4`?~alF#ruT+QxcEu?R9r@HBoZ`Km8{&HOu|8 zI2t#?C3m?o;?G!Fk;BgIz%iLx1$JqVw3OrdPn3vir|>b~i9O?_^L+n!u6+{(4%>t< z+}2UV~5tJL7wraN*Mo&bIfMcR4C=3L7S0G2A&%oqT<=HdV-v>CiAYP2yeWy)(wYU zQlc|Kkm=8C`oK>{=Y?-~x=>zJF}WL4tmWo?|BUg*8!!KtLEt$so(X3WF>{*!l`ya< zS96;;3_tqMzH!AWcuBvp9Z7Eo7C63-Ir?hyMwvR@Cr`oOWA4}K-dP^9J|QoYCEwC& zbae_w{)>Yp@(0s%cC2BhfKJoU!M5`&p~)h``m1MEgleg{XR>lOjiw>l@_yi>utZK4 zTHA!?@$EZ_IY|*S$p~!ElJ!Wi(5{GhrDe>-Y$8L@W94vrhD54l2VOR2bHzkn0!l^c zB+`&htQCDoETZ%)Gc~R<3Z$M3(v3laRre^o_5NF=J#>6hyGcqi2mDM{D^yOdM8%S?qFu%Ja=)gESg4jRIeU0u%NB%0U*8#&U*e zMh0UT%>3C^+fqz)@RXcsXR(+aolD^T=rEQbrKYrs|H-AxP21A;QMzGgR`%UUoWm-) z*mN-r(Qd=5?N?94>v}DXDU@>e)>*BANtPs)E`%fHjfu7xH?DRiReMwqTaY0+Gx3NLt5l+4{O}%3_ik3YZ-M{%W$7lP2eS>Qen5r8 z_g^>y0zVw}CZ4wHhj2pFyj?rj_I7^P|7g7@3ho`aePA0~Q`7ow|C*$cV`SWV%A&%W z;4zV~YzQ%CG9-3?gZ=a{K5(u7@&4WwJCc*2!K`MItW5CE4jL*;o~6pK9^F5+1IDgy z0B;FC#CGzv<|%NoS(3Ripo59BNSY1^TN>aJ^o`dqv)Qnm)1Tjvn}#4voGcq56R|5j zIg<;oh4w9uyJRMrR&~maR&#fE&Vn#ev08LbF2mJw@ICiWWDaY%#1x?;{@xFGxsR%E z24q(HAkGaAs&}+k3;hh7YI#)!05ly>K$zhkC2xXQZ8;B;>yhRv);yz*I;@2kf7?5F zJCtZW1?W|O{}X0wFmL;xzvtnoCrjVi|zu?1Y&Q*m6Tn5NELEKUs5}Z$D|I(#gHvIlPckA-n~T{WUQE2QPD1-faYzKG4)`}0U{q~sB$ZAq zVhj)b0rmdEvo}*)ESiw8Bh;KWB~vksEV0ns z&6G6m4irt&RR?lV3Avk0j{=O~IBfE1S$}O@zlT0KO+JPR-u|hAvc*ldR*_I3v<{Fm zGLLs*)YNSxl)ixV47VWn#Uy`!^L{FJo&n6LdPvC_uo|Ejyy%u}^8c6p+d zrRDR*m=ZM7zH8>zDZ>c>Eb?cag3x=)*FkNsad+erCO55nLXi-3fM_O^YWQ`pEBj*H z?eD9*{iuv@pa@=hXM9ah9Z40=Zlyholi&Qv9uYfFT#Bw38E$e=1$vO_P3(jiY4Q`| zuinuS`6ji|DB9C&&bE?gRMpk%x)|<`Rj{p;v^Hbsa>9U_qDsxMGSxp8`9(j@&#Vvz zoYZjg%ZAuQn1(V#FnP0<*X26%7xjbT}yAyUP6Bdd#6={F4Hwo--*} zAmT`78yTQ^4MUfZv=Bz6LKegKypjLu;5 znOk;8q8Kal!_u}9{xgR?^fyZnyL%d*F#LN88v^dWmcUQ3n8l}^q{YWVTf*}j4KsLi z;ld~`WPp13h3yc61L0-rrk!ur$*}?!t>#0AlJm9J)f|5|t2z<`zAzdA@d@v1dP#7l z*za6_h`dmFy*NRo?hF*hnUMfOFuKvbr`4{Xy+>>B#!=G33|U)Gl3EXTdSsPr&%8J~ z$42Jj=zV)xMGS{bib~H!_@VyMEa0R1OP=PGOF4vu1MZ(v+nV$iH7Z*PxX(BiMNg-- zoXbfQccE@cCj!!w7le_#2(xYa6;#;^^i#7vykQ}b}PU=N|EzhI-oYDnoDGuqY#3 z1m?m}1s|CJ7PZ(PHP#(5Kr0GLBPNEh#SN_BZq+xu7e0nl2=xy_?yQfT+2cX0S;&e< z%`~apXau>H?FznoyZjA|<-zzq39$5aR(`X0p{O%)_@9VxAfrk1V7t}~Z*5;m<|`ty z-+0bhG5q;POpGGuPb+tL_xbGzs@;Lc{={GcEWray;pSboov08awnz1kmvm8yJ+Hk% zuMBw>>T~|7;WKjt9$i3iNx$3zjtHgS8CmXwb5CRU_=fv(k_3STiJ5O6`aHHPZh+E6 zCowTw^p!P*T{z%2st=s;SkE`!>d<(2vSo?BY30FtA$>hBmBnves{|XlrnP4H>2%gNmn&?Sw;mxOLI^1{_j^%3!e-X}=~czIeHnNOuX>iHgD zPCOYgGYNnG`ORHjPc`~O!RH@G{pNN9H@?52ppXH$=K-K}&!1_~7AL>w=jVS8*S*Ur z(wT7L2w1PTUQ~qHXFl0aCm(`AD!%z{`VZcD|MdX6#QA(qefQoQYz102^biu}pN9Hm zmOtz3B+-N-k&%plQoWLo@=-Pk{0F3kH(LD+T+zagcMshJ_Ih zZkgMT)_Bil4PdT0Z;D{z4j`Vzj8(!N_#(~o4GCYpkm6mdEUZvGF+i@|Z6-j9rh`-| zEVF5e|12q`Kx~$)!-*ob;akI4DP5Zw?)lt*y;tg{di%I>Fy}&aph*+c)*~LS^t%^q zgr<0`&orQdNsI*tLs4pQ`h^a98{!3L0r#S@)3{W>Sh78pVa`(jrm#lUX^!m~T1?-pm@iuTkBZSEhn7VAF;{?@VF z7@jDqfokYt@l&=a$ko+nvIa!hI`(|SqrxSmK?%kL$cx3y4dtJsBLcnR*-sYKfWy|> zkhCwjmfp+62WI%+#8v<=CIe}-S2bXM9JMkr4AuER}@e$;a5vG0v2RmsJN;4i?s2b;aO|drm z3Siz8s@vmys%FnH93#GhB=e1|W{aDCxwM=L(=sHXJ1VEyAKuJSdy@f#^B1IJT>g(uP4k06Fb@M!oPMJUk(0!fivJ@Z0$Jit-g-H zuzG=bCRzzvoy{3NzQ6i~K?jhC?In~iCuv`fl+cENjfjBU+0uz{(+dz6<`h3R8G!Kb zivRN^jR2SH`;y?)q_w86kLPficSc5Q+ywf9XKE$}Usie@IDCic-+?a)@(x?GhCG$* zPgYhHsF(HojiWr)Az;h2@6?d(paI_&zd){xL=5IdV+xDjD zbHb7s?1SO&_YMuxdIJ_sGA9i^KAI6n9#Nz)3<}l{$^04R?Jzh`nQoB4GQAxS#Ld)m zSfQ<8NV=~?Qer#1)wrZ634%?QpRtCMT+n`lVPB{dke+Z94sQaX#pX>1N}uu8>#a7 z)fSUOoV6tG%27%hDa<)zDb-UPj$`lT#Kxj=N5-4IXkU(KOyEzZ39?fgZ9rDVb&>#w z_cOR`$1ZzLc;SyU%ZN8Fl72fpG7wH&697DVyd|Q%#GfieuAT|ff@T{>01^B*YLzNm zHmtf3bs+ld!iAfCr9T4KvvytX$&0p|M|tVP)WbQUl$lbY*q{HtrFF1J<9&I;wP@pg zsU)MszTWbDXvVPLreLzJ_DdIik`l0%zURl2=iLM&djU{a4t;)(r(W|vX8dNSNP{a+ z)1_W=KSC_M?p5D8C9B8XRf(p3*(l%4q@=C>bpXG0KQVYfev=zqv+q;+Y*E*!BlHm~ z;86KW0QJ?}{(#l!{WTl1V^aYWJ+_-RR(M_Ns=z9bXWEpA}rtFoi zS6Nu&a}f_{(>ujLJd8l<7*g?53b6V4nvX+7es*quUDkhHX5Uaq6jE6W?At`Lok

        - -Итого: - -```js -function getDocumentScroll() { - var scrollHeight = Math.max( - document.body.scrollHeight, document.documentElement.scrollHeight, - document.body.offsetHeight, document.documentElement.offsetHeight, - document.body.clientHeight, document.documentElement.clientHeight - ); - - return { - top: pageYOffset, - bottom: pageYOffset + document.documentElement.clientHeight, - height: scrollHeight - }; -} -``` - diff --git a/2-ui/1-document/18-coordinates-document/1-get-document-scrolls/task.md b/2-ui/1-document/18-coordinates-document/1-get-document-scrolls/task.md deleted file mode 100644 index d82bc669..00000000 --- a/2-ui/1-document/18-coordinates-document/1-get-document-scrolls/task.md +++ /dev/null @@ -1,15 +0,0 @@ -# Область видимости для документа - -[importance 5] - -Напишите функцию `getDocumentScroll()`, которая возвращает объект с информацией о текущей прокрутке и области видимости. - -Свойства объекта-результата: - -
          -
        • `top` -- координата верхней границы видимой части (относительно документа).
        • -
        • `bottom` -- координата нижней границы видимой части (относительно документа).
        • -
        • `height` -- полная высота документа, включая прокрутку.
        • -
        - -В этой задаче учитываем только вертикальную прокрутку: горизонтальная делается аналогично, а нужна сильно реже. \ No newline at end of file diff --git a/2-ui/1-document/18-coordinates-document/2-position-at-absolute/solution.md b/2-ui/1-document/18-coordinates-document/2-position-at-absolute/solution.md deleted file mode 100644 index e69de29b..00000000 diff --git a/2-ui/1-document/18-coordinates-document/2-position-at-absolute/solution.view/index.css b/2-ui/1-document/18-coordinates-document/2-position-at-absolute/solution.view/index.css deleted file mode 100644 index 700bd8c2..00000000 --- a/2-ui/1-document/18-coordinates-document/2-position-at-absolute/solution.view/index.css +++ /dev/null @@ -1,28 +0,0 @@ -.note { - position: absolute; - z-index: 1000; - padding: 5px; - border: 1px solid black; - background: white; - text-align: center; - font: italic 14px Georgia; -} - -blockquote { - background: #f9f9f9; - border-left: 10px solid #ccc; - margin: 0 0 0 100px; - padding: .5em 10px; - quotes: "\201C""\201D""\2018""\2019"; - display: inline-block; - white-space: pre; -} - -blockquote:before { - color: #ccc; - content: open-quote; - font-size: 4em; - line-height: .1em; - margin-right: .25em; - vertical-align: -.4em; -} \ No newline at end of file diff --git a/2-ui/1-document/18-coordinates-document/2-position-at-absolute/solution.view/index.html b/2-ui/1-document/18-coordinates-document/2-position-at-absolute/solution.view/index.html deleted file mode 100644 index 6b28fea1..00000000 --- a/2-ui/1-document/18-coordinates-document/2-position-at-absolute/solution.view/index.html +++ /dev/null @@ -1,100 +0,0 @@ - - - - - - - - - - -

        Исправления два:

        - -
          -
        1. Использование функции getCoords() из учебника для получения абсолютных координат.
        2. -
        3. Изменение position:fixed на position:absolute в стилях.
        4. -
        - -
        - - Что на завтрак, Бэрримор? - Овсянка, сэр. - А на обед? - Овсянка, сэр. - Ну а на ужин? - Котлеты, сэр. - Уррра!!! - Из овсянки, сэр!!! -
        - -

        Lorem ipsum dolor sit amet, consectetur adipisicing elit. Reprehenderit sint atque dolorum fuga ad incidunt voluptatum error fugiat animi amet! Odio temporibus nulla id unde quaerat dignissimos enim nisi rem provident molestias sit tempore omnis recusandae - esse sequi officia sapiente.

        - - - - - - - - \ No newline at end of file diff --git a/2-ui/1-document/18-coordinates-document/2-position-at-absolute/task.md b/2-ui/1-document/18-coordinates-document/2-position-at-absolute/task.md deleted file mode 100644 index 5e229a89..00000000 --- a/2-ui/1-document/18-coordinates-document/2-position-at-absolute/task.md +++ /dev/null @@ -1,9 +0,0 @@ -# Разместить заметку рядом с элементом (absolute) - -[importance 5] - -Модифицируйте решение задачи [](/task/position-at), чтобы при прокрутке страницы заметка не убегала от элемента. - -Используйте для этого координаты относительно документа и `position:absolute` вместо `position:fixed`. - -В качестве исходного документа используйте решение задачи [](/task/position-at), для тестирования прокрутки добавьте стиль ``. \ No newline at end of file diff --git a/2-ui/1-document/18-coordinates-document/3-position-at-2/solution.md b/2-ui/1-document/18-coordinates-document/3-position-at-2/solution.md deleted file mode 100644 index e69de29b..00000000 diff --git a/2-ui/1-document/18-coordinates-document/3-position-at-2/solution.view/index.css b/2-ui/1-document/18-coordinates-document/3-position-at-2/solution.view/index.css deleted file mode 100644 index d2493f6e..00000000 --- a/2-ui/1-document/18-coordinates-document/3-position-at-2/solution.view/index.css +++ /dev/null @@ -1,29 +0,0 @@ -.note { - position: absolute; - z-index: 1000; - padding: 5px; - border: 1px solid black; - background: white; - text-align: center; - font: italic 14px Georgia; - opacity: .8; -} - -blockquote { - background: #f9f9f9; - border-left: 10px solid #ccc; - margin: 0 0 0 100px; - padding: .5em 10px; - quotes: "\201C""\201D""\2018""\2019"; - display: inline-block; - white-space: pre; -} - -blockquote:before { - color: #ccc; - content: open-quote; - font-size: 4em; - line-height: .1em; - margin-right: .25em; - vertical-align: -.4em; -} \ No newline at end of file diff --git a/2-ui/1-document/18-coordinates-document/3-position-at-2/solution.view/index.html b/2-ui/1-document/18-coordinates-document/3-position-at-2/solution.view/index.html deleted file mode 100644 index df1b2820..00000000 --- a/2-ui/1-document/18-coordinates-document/3-position-at-2/solution.view/index.html +++ /dev/null @@ -1,115 +0,0 @@ - - - - - - - - - - -

        Lorem ipsum dolor sit amet, consectetur adipisicing elit. Reprehenderit sint atque dolorum fuga ad incidunt voluptatum error fugiat animi amet! Odio temporibus nulla id unde quaerat dignissimos enim nisi rem provident molestias sit tempore omnis recusandae - esse sequi officia sapiente.

        - - -
        - - Что на завтрак, Бэрримор? - Овсянка, сэр. - А на обед? - Овсянка, сэр. - Ну а на ужин? - Котлеты, сэр. - Уррра!!! - Из овсянки, сэр!!! -
        - -

        Lorem ipsum dolor sit amet, consectetur adipisicing elit. Reprehenderit sint atque dolorum fuga ad incidunt voluptatum error fugiat animi amet! Odio temporibus nulla id unde quaerat dignissimos enim nisi rem provident molestias sit tempore omnis recusandae - esse sequi officia sapiente.

        - - - - - - - - \ No newline at end of file diff --git a/2-ui/1-document/18-coordinates-document/3-position-at-2/task.md b/2-ui/1-document/18-coordinates-document/3-position-at-2/task.md deleted file mode 100644 index f81c127f..00000000 --- a/2-ui/1-document/18-coordinates-document/3-position-at-2/task.md +++ /dev/null @@ -1,27 +0,0 @@ -# Разместить заметку внутри элемента - -[importance 5] - -Расширьте предыдущую задачу [](/task/position-at-absolute): научите функцию `positionAt(anchor, position, elem)` вставлять `elem` внутрь `anchor`. - -Новые значения `position`: -
          -
        • `top-out`, `right-out`, `bottom-out` -- работают так же, как раньше, то есть вставляют `elem` над/справа/под `anchor`.
        • -
        • `top-in`, `right-in`, `bottom-in` -- вставляют `elem` внутрь `anchor`: к верхней границе/правой/нижней.
        • -
        - -Например: - -```js -// покажет note сверху blockquote -positionAt(blockquote, "top-out", note); - -// покажет note сверху-внутри blockquote -positionAt(blockquote, "top-in", note); -``` - -Пример результата: - -[iframe src="solution" height="500" border="1" link] - -В качестве исходного документа возьмите решение задачи [](/task/position-at-absolute). \ No newline at end of file diff --git a/2-ui/1-document/18-coordinates-document/article.md b/2-ui/1-document/18-coordinates-document/article.md deleted file mode 100644 index 9e25fc76..00000000 --- a/2-ui/1-document/18-coordinates-document/article.md +++ /dev/null @@ -1,226 +0,0 @@ -# Координаты в документе - -*Система координат относительно страницы* или, иначе говоря, *относительно документа*, начинается в левом-верхнем углу, но не окна, а именно страницы. - -И координаты в ней означают позицию по отношению не к окну браузера, а к документу в целом. - -Если провести аналогию с CSS, то координаты относительно окна -- это `position:fixed`, а относительно документа -- `position:absolute` (при позиционировании вне других элементов, естественно). - -Мы будем называть координаты в ней `pageX/pageY`. - -[cut] - -Они нужны в первую очередь для того, чтобы показывать элемент в определённом месте страницы, а не окна. - -## Сравнение систем координат - -Когда страница не прокручена, точки начала координат относительно окна `(clientX,clientY)` и документа `(pageX,pageY)` совпадают: - - - -Например, координаты элемента с надписью "STANDARDS" равны расстоянию от верхней/левой границы окна: - - - -**Прокрутим страницу, чтобы элемент был на самом верху:** - -Посмотрите на рисунок ниже, на нём -- та же страница, только прокрученная, и тот же элемент "STANDARDS". - -
          -
        • Координата `clientY` изменилась. Она была `175`, а стала `0`, так как элемент находится вверху окна.
        • -
        • Координата `pageY` осталась такой же, так как отсчитывается от левого-верхнего угла *документа*.
        • -
        - - - -Итак, координаты `pageX/pageY` не меняются при прокрутке, в отличие от `clientX/clientY`. - -## Получение координат [#getCoords] - -К сожалению, готовой функции для получения координат элемента относительно страницы нет. Но её можно легко написать самим. - -Эти две системы координат жёстко связаны: `pageY = clientY + текущая вертикальная прокрутка`. - -Наша функция `getCoords(elem)` будет брать результат `elem.getBoundingClientRect()` и прибавлять текущую прокрутку документа. - -Результат `getCoords`: объект с координатами `{left: .., top: ..}` - -```js -function getCoords(elem) { // кроме IE8- - var box = elem.getBoundingClientRect(); - - return { - top: box.top + pageYOffset, - left: box.left + pageXOffset - }; - -} -``` - -Если нужно поддерживать более старые IE, то вот альтернативный, самый кросс-браузерный вариант: - -```js -//+ autorun -function getCoords(elem) { - // (1) - var box = elem.getBoundingClientRect(); - - var body = document.body; - var docEl = document.documentElement; - - // (2) - var scrollTop = window.pageYOffset || docEl.scrollTop || body.scrollTop; - var scrollLeft = window.pageXOffset || docEl.scrollLeft || body.scrollLeft; - - // (3) - var clientTop = docEl.clientTop || body.clientTop || 0; - var clientLeft = docEl.clientLeft || body.clientLeft || 0; - - // (4) - var top = box.top + scrollTop - clientTop; - var left = box.left + scrollLeft - clientLeft; - - return { - top: top, - left: left - }; -} -``` - -Разберем что и зачем, по шагам: - -
          -
        1. Получаем прямоугольник.
        2. -
        3. Считаем прокрутку страницы. Все браузеры, кроме IE8- поддерживают свойство `pageXOffset/pageYOffset`. В более старых IE, когда установлен DOCTYPE, прокрутку можно получить из `documentElement`, ну и наконец если DOCTYPE некорректен -- использовать `body`.
        4. -
        5. В IE документ может быть смещен относительно левого верхнего угла. Получим это смещение.
        6. -
        7. Добавим прокрутку к координатам окна и вычтем смещение `html/body`, чтобы получить координаты всего документа.
        8. -
        - -### Устаревший метод: offset* - -Есть альтернативный способ нахождения координат -- это пройти всю цепочку `offsetParent` от элемента вверх и сложить отступы `offsetLeft/offsetTop`. - -Мы разбираем его здесь с учебной целью, так как он используется лишь в старых браузерах. - -Вот функция, реализующая такой подход. - -```js -//+ autorun -function getOffsetSum(elem) { - var top = 0, - left = 0; - - while (elem) { - top = top + parseInt(elem.offsetTop); - left = left + parseInt(elem.offsetLeft); - elem = elem.offsetParent; - } - - return { - top: top, - left: left - }; -} -``` - -Казалось бы, код нормальный. И он как-то работает, но разные браузеры преподносят "сюрпризы", включая или выключая размер рамок и прокруток из `offsetTop/Left`, некорректно учитывая позиционирование. В итоге результат не всегда верен. Можно, конечно, разобрать эти проблемы и посчитать действительно аккуратно и правильно этим способом, но зачем? Ведь есть `getBoundingClientRect`. - -[online] -Вы можете увидеть разницу между вычислением координат через `offset*` и `getBoundingClientRect` на примере. - -В прямоугольнике ниже есть 3 вложенных `DIV`. Все они имеют `border`, кое-кто из них имеет `position/margin/padding`. - -Кликните по внутреннему (жёлтому) элементу, чтобы увидеть результаты обоих методов: `getOffsetSum` и `getCoords`, а также реальные координаты курсора -- `event.pageX/pageY` (мы обсудим их позже в статье [](/fixevent)). - -[pre] -
        -
        -
        Кликните, чтобы получить координаты getOffsetSum и getCoords
        -
        -
        -
        -
        getOffsetSum:значение getOffsetSum()
        -
        getCoords:значение getCoords()
        -
        mouse:координаты мыши
        -
        - - -[/pre] - -**При клике на любом месте желтого блока вы легко увидите разницу между `getOffsetSum(elem)` и `getCoords(elem)`.** - -Для того, чтобы узнать, какой же результат верный, кликните в левом-верхнем углу жёлтого блока, причём обратите внимание -- кликать нужно не на жёлтом, а на чёрном, это рамка, она тоже входит в элемент. Будут видны точные координаты мыши, так что вы можете сравнить их с `getOffsetSum/getCoords`. - -Пример клика в правильном месте (обратите внимание на разницу координат): - - - -Именно `getCoords` всегда возвращает верное значение. -[/online] - -## Координаты на экране screenX/screenY - -Есть ещё одна система координат, которая используется очень редко, но для полноты картины необходимо её упомянуть. - -*Координаты относительно экрана* `screenX/screenY` отсчитываются от его левого-верхнего угла. Имеется в виду именно *весь экран*, а не окно браузера. - - - -Такие координаты могут быть полезны, например, при работе с мобильными устройствами или для открытия нового окна посередине экрана вызовом [window.open](https://developer.mozilla.org/en-US/docs/DOM/window.open). - -
          -
        • Размеры экрана хранятся в глобальной переменной [screen](https://developer.mozilla.org/en/DOM/window.screen): - -```js -//+ run -// общая ширина/высота -alert( screen.width + ' x ' + screen.height ); - -// доступная ширина/высота (за вычетом таскбара и т.п.) -alert( screen.availWidth + ' x ' + screen.availHeight ); - -// есть и ряд других свойств screen (см. документацию) -``` - -
        • -
        • Координаты левого-верхнего угла браузера на экране хранятся в `window.screenX,` `window.screenY` (не поддерживаются IE8-): - -```js -//+ run -alert( "Браузер находится на " + window.screenX + "," + window.screenY ); -``` - -Они могут быть и меньше нуля, если окно частично вне экрана.
        • -
        - -Заметим, что общую информацию об экране и браузере получить можно, а вот координаты конкретного элемента на экране -- нельзя, нет аналога `getBoundingClientRect` или иного метода для этого. - -## Итого - -У любой точки в браузере есть координаты: -
          -
        1. Относительно окна `window` -- `elem.getBoundingClientRect()`.
        2. -
        3. Относительно документа `document` -- добавляем прокрутку, во всех фреймворках есть готовая функция.
        4. -
        5. Относительно экрана `screen` -- можно узнать координаты браузера, но не элемента.
        6. -
        - -Иногда в старом коде можно встретить использование `offsetTop/Left` для подсчёта координат. Это очень старый и неправильный способ, не стоит его использовать. - -Координаты будут нужны нам далее, при работе с событиями мыши (координаты клика) и элементами (перемещение). - diff --git a/2-ui/1-document/18-coordinates-document/getcoords-compare.png b/2-ui/1-document/18-coordinates-document/getcoords-compare.png deleted file mode 100755 index bc0890a20c9d00cbe205ddd35de1096ec33db92a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9622 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 diff --git a/2-ui/1-document/18-coordinates-document/getcoords-compare@2x.png b/2-ui/1-document/18-coordinates-document/getcoords-compare@2x.png deleted file mode 100755 index 94d9b4a9d1c258ce157d71cc01302daca257c69f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16397 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 a$A0D)%6rUhgr|Ql5lf59i;O(N@OJv}|E z2hV>0IZbL^Ky6ooZI*X)eLXfdX2|WYqobo0Hn+F8*Vx?A)zzgL`fp`r+8Om^>W0^_V)I{!GUVv%*#tJ zrb+JM;o;oeoPY02dq+n|IU*`5`sHN@!}#~m@NiR8Q-6PdxgmFRbF-$V*5cxl@vkX6 zJ3A~fLw|1WnVH$+qod8u&6i$(US9u-ib{Wf|C7^x9-nF

        MnGc~wfyqx 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 diff --git a/2-ui/1-document/18-coordinates-document/screen.png b/2-ui/1-document/18-coordinates-document/screen.png deleted file mode 100755 index a92cf655ee459db9b9951ccf578d75300887d4e6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22365 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 diff --git a/2-ui/1-document/18-coordinates-document/standards-scroll.png b/2-ui/1-document/18-coordinates-document/standards-scroll.png deleted file mode 100755 index e212238be1f1c4232a9b7546209159f71a2d8624..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23446 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

        9l`zrwKYQh`Y1VZbbG~P2(O> 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 LGnE>sP2~Ro0k|qA diff --git a/2-ui/1-document/18-coordinates-document/standards.png b/2-ui/1-document/18-coordinates-document/standards.png deleted file mode 100755 index a76de32ed5d89ae534ddef6e85dfacb857eba117..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26537 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 -

        `document.createElement(tag)`
        Создать элемент с тегом `tag`
        -
        `document.createTextNode(txt)`
        Создать текстовый узел с текстом `txt`
        -
        `node.cloneNode(deep)`
        Клонировать существующий узел, если `deep=false`, то без потомков.
        -
        - -## Свойства узлов - -
        -
        `node.nodeType`
        Тип узла: 1(элемент) / 3(текст) / другие.
        -
        `elem.tagName`
        Тег элемента.
        -
        `elem.innerHTML`
        HTML внутри элемента.
        -
        `elem.outerHTML`
        Весь HTML элемента, включая сам тег. На запись использовать с осторожностью, так как не модифицирует элемент, а вставляет новый вместо него.
        -
        `node.data` / `node.nodeValue`
        Содержимое узла любого типа, кроме элемента.
        -
        `node.textContent`
        Текстовое содержимое узла, для элементов содержит текст с вырезанными тегами (IE9+).
        -
        `elem.hidden`
        Если поставить `true`, то элемент будет скрыт (IE10+).
        -
        - -## Атрибуты - -
        -
        `elem.getAttribute(name)`, `elem.hasAttribute(name)`, `elem.setAttribute(name, value)`
        -
        Чтение атрибута, проверка наличия и запись.
        -
        `elem.dataset.*`
        Значения атрибутов вида `data-*` (IE10+).
        -
        - -## Ссылки - -
        -
        `document.documentElement`
        -
        Элемент ``
        -
        `document.body`
        -
        Элемент ``
        -
        `document.head`
        -
        Элемент `` (IE9+)
        -
        - -По всем узлам: -
          -
        • `parentNode`
        • -
        • `nextSibling` `previousSibling`
        • -
        • `childNodes` `firstChild` `lastChild`
        • -
        - -Только по элементам: - -
          -
        • `parentElement`
        • -
        • `nextElementSibling` `previousElementSibling`
        • -
        • `children`, `firstElementChild` `lastElementChild`
        • -
        - -Все они IE9+, кроме `children`, который работает в IE8-, но содержит не только элементы, но и комментарии (ошибка в браузере). - -Дополнительно у некоторых типов элементов могут быть и другие ссылки, свойства, коллекции для навигации, -например для таблиц: - -
        -
        `table.rows[N]`
        -
        строка `TR` номер `N`.
        -
        `tr.cells[N]`
        -
        ячейка `TH/TD` номер `N`.
        -
        `tr.sectionRowIndex`
        -
        номер строки в таблице в секции `THEAD/TBODY`.
        -
        `td.cellIndex`
        -
        номер ячейки в строке.
        -
        - -## Поиск - - -
        -
        `*.querySelector(css)`
        -
        По селектору, только первый элемент
        -
        `*.querySelectorAll(css)`
        -
        По селектору CSS3, в IE8 по CSS 2.1
        -
        `document.getElementById(id)`
        -
        По уникальному `id`
        -
        `document.getElementsByName(name)`
        -
        По атрибуту `name`, в IE9- работает только для элементов, где `name` предусмотрен стандартом.
        -
        `*.getElementsByTagName(tag)`
        -
        По тегу `tag`
        -
        `*.getElementsByClassName(class)`
        -
        По классу, IE9+, корректно работает с элементами, у которых несколько классов.
        -
        - -Вообще, обычно можно использовать только `querySelector/querySelectorAll`. Методы `getElement*` работают быстрее (за счёт более оптимальной внутренней реализации), но в 99% случаев это различие очень небольшое и роли не играет. - -Дополнительно есть методы: -
        -
        `elem.matches(css)`
        -
        Проверяет, подходит ли элемент под CSS-селектор.`elem.closest(css)` -
        Ищет ближайший элемент сверху по иерархии DOM, подходящий под CSS-селектор. Первым проверяется сам `elem`. Этот элемент возвращается.
        -
        `elemA.contains(elemB)`
        -
        Возвращает `true`, если `elemA` является предком (содержит) `elemB`.
        -
        `elemA.compareDocumentPosition(elemB)`
        -
        Возвращает битовую маску, которая включает в себя отношение вложенности между `elemA` и `elemB`, а также -- какой из элементов появляется в DOM первым.
        - -
        - - -## Изменение - -
          -
        • `parent.appendChild(newChild)`
        • -
        • `parent.removeChild(child)`
        • -
        • `parent.insertBefore(newChild, refNode)`
        • -
        • `parent.insertAdjacentHTML("beforeBegin|afterBegin|beforeEnd|afterEnd", html)`
        • -
        • `parent.insertAdjacentElement("beforeBegin|...|afterEnd", text)` (кроме FF)
        • -
        • `parent.insertAdjacentText("beforeBegin|...|afterEnd", text)` (кроме FF)
        • -
        • `document.write(...)`
        • -
        - -Скорее всего, понадобятся полифиллы для: - -
          -
        • `node.append(...nodes)`
        • -
        • `node.prepend(...nodes)`
        • -
        • `node.after(...nodes)`,
        • -
        • `node.before(...nodes)`
        • -
        • `node.replaceWith(...nodes)`
        • -
        - -## Классы и стили - -
        -
        `elem.className`
        -
        Атрибут `class` -
        `elem.classList.add(class) remove(class) toggle(class) contains(class)`
        -
        Управление классами, для IE9- есть [эмуляция](https://github.com/eligrey/classList.js/blob/master/classList.js).
        -
        `elem.style`
        -
        Стили в атрибуте `style` элемента
        -
        `getComputedStyle(elem, "")` -
        Стиль, с учётом всего каскада, вычисленный и применённый (только чтение)
        -
        - -## Размеры и прокрутка элемента - -
        -
        `clientLeft/Top`
        -
        Ширина левой/верхней рамки `border`
        -
        `clientWidth/Height`
        -
        Ширина/высота внутренней части элемента, включая содержимое и `padding`, не включая полосу прокрутки (если есть).
        -
        `scrollWidth/Height`
        -
        Ширина/высота внутренней части элемента, с учетом прокрутки.
        -
        `scrollLeft/Top`
        -
        Ширина/высота прокрученной области.
        -
        `offsetWidth/Height`
        -
        Полный размер элемента: ширина/высота, включая `border`.
        -
        - -## Размеры и прокрутка страницы - -
          -
        • ширина/высота видимой области: `document.documentElement.clientHeight`
        • -
        • прокрутка(чтение): `window.pageYOffset || document.documentElement.scrollTop`
        • -
        • прокрутка(изменение): -
            -
          • `window.scrollBy(x,y)`: на x,y относительно текущей позиции.
          • -
          • `window.scrollTo(pageX, pageY)`: на координаты в документе.
          • -
          • `elem.scrollIntoView(true/false)`: прокрутить, чтобы `elem` стал видимым и оказался вверху окна(`true`) или внизу(`false`)
          • -
          -
        • -
        - -## Координаты - -
          -
        • относительно окна: `elem.getBoundingClientRect()`
        • -
        • относительно документа: `elem.getBoundingClientRect()` + прокрутка страницы
        • -
        • получить элемент по координатам: `document.elementFromPoint(clientX, clientY)`
        • -
        - -Список намеренно сокращён, чтобы было проще найти то, что нужно. diff --git a/2-ui/1-document/2-dom-nodes/1-body-from-head/solution.md b/2-ui/1-document/2-dom-nodes/1-body-from-head/solution.md deleted file mode 100644 index 399d66bc..00000000 --- a/2-ui/1-document/2-dom-nodes/1-body-from-head/solution.md +++ /dev/null @@ -1,21 +0,0 @@ -Выведет `null`, так как на момент выполнения скрипта тег `` ещё не обработан браузером. - -Попробуйте в действии: - -```html - - - - - - - - - Привет, мир! - - - -``` - diff --git a/2-ui/1-document/2-dom-nodes/1-body-from-head/task.md b/2-ui/1-document/2-dom-nodes/1-body-from-head/task.md deleted file mode 100644 index ef89617c..00000000 --- a/2-ui/1-document/2-dom-nodes/1-body-from-head/task.md +++ /dev/null @@ -1,24 +0,0 @@ -# Что выведет этот alert? - -[importance 5] - -Что выведет `alert`? - -```html - - - -*!* - -*/!* - - - - Привет, мир! - - - -``` - diff --git a/2-ui/1-document/2-dom-nodes/article.md b/2-ui/1-document/2-dom-nodes/article.md deleted file mode 100644 index aed95c16..00000000 --- a/2-ui/1-document/2-dom-nodes/article.md +++ /dev/null @@ -1,269 +0,0 @@ -# Дерево DOM - -Основным инструментом работы и динамических изменений на странице является DOM (Document Object Model) -- объектная модель, используемая для XML/HTML-документов. - - -[cut] -Согласно DOM-модели, документ является иерархией, деревом. Каждый HTML-тег образует узел дерева с типом "элемент". Вложенные в него теги становятся дочерними узлами. Для представления текста создаются узлы с типом "текст". - -DOM -- это представление документа в виде дерева объектов, доступное для изменения через JavaScript. - -## Пример DOM - -Построим, для начала, дерево DOM для следующего документа. - -```html - - - - - О лосях - - - Правда о лосях - - -``` - -Его вид: - -
        - - -В этом дереве выделено два типа узлов. - -
          -
        1. Теги образуют *узлы-элементы* (element node). Естественным образом одни узлы вложены в другие. Структура дерева образована исключительно за счет них.
        2. -
        3. Текст внутри элементов образует *текстовые узлы* (text node), обозначенные как `#text`. Текстовый узел содержит исключительно строку текста и не может иметь потомков, то есть он всегда на самом нижнем уровне.
        4. -
        - -[online] -**На рисунке выше синие узлы-элементы можно кликать, при этом их дети будут скрываться-раскрываться.** -[/online] - -Обратите внимание на специальные символы в текстовых узлах: -
          -
        • перевод строки: `↵`
        • -
        • пробел: `␣`
        • -
        - -**Пробелы и переводы строки -- это тоже текст, полноправные символы, которые учитываются в DOM.** - -В частности, в примере выше тег `` содержит не только узлы-элементы `` и ``, но и `#text` (пробелы, переводы строки) между ними. - -Впрочем, как раз на самом верхнем уровне из этого правила есть исключения: пробелы до `` по стандарту игнорируются, а любое содержимое после `` не создаёт узла, браузер переносит его внутрь, в конец `body`. - -В остальных случаях всё честно -- если пробелы есть в документе, то они есть и в DOM, а если их убрать, то и в DOM их не будет, получится так: - -```html - - -О лосяхПравда о лосях -``` - -
        - - -## Автоисправление - -При чтении неверного HTML браузер автоматически корректирует его для показа и при построении DOM. - -В частности, всегда будет верхний тег ``. Даже если в тексте нет -- в DOM он будет, браузер создаст его самостоятельно. - -То же самое касается и тега ``. - -Например, если файл состоит из одного слова `"Привет"`, то браузер автоматически обернёт его в `` и ``. - -**При генерации DOM браузер самостоятельно обрабатывает ошибки в документе, закрывает теги и так далее.** - -Такой документ: - -```html - -

        Привет -

      • Мама -
      • и -
      • Папа -``` - -...Превратится вот во вполне респектабельный DOM, браузер сам закроет теги: - -
        - - -[warn header="Таблицы всегда содержат ``"] -Важный "особый случай" при работе с DOM -- таблицы. По стандарту DOM они обязаны иметь ``, однако в HTML их можно написать без него. В этом случае браузер добавляет `` самостоятельно. - -Например, для такого HTML: - -```html - - - -
        1
        -``` - -DOM-структура будет такой: -
        - - -Вы видите? Появился ``, как будто документ был таким: - -```html - - -*!* - -*/!* - -*!* - -*/!* -
        1
        -``` - -Важно знать об этом, иначе при работе с таблицами возможны сюрпризы. -[/warn] - - -## Другие типы узлов - -Дополним страницу новыми тегами и комментарием: - -```html - - - - - Правда о лосях -
          -
        1. Лось — животное хитрое
        2. -*!* - -*/!* -
        3. ...и коварное!
        4. -
        - - - -``` - -
        - - -**В этом примере тегов уже больше, и даже появился узел нового типа -- *комментарий*.** - -Казалось бы, зачем комментарий в DOM? На отображение-то он всё равно не влияет. Но так как он есть в HTML -- обязан присутствовать в DOM-дереве. - -**Всё, что есть в HTML, находится и в DOM.** - -Даже директива ``, которую мы ставим в начале HTML, тоже является DOM-узлом, и находится в дереве DOM непосредственно перед ``. На иллюстрациях выше этот факт скрыт, поскольку мы с этим узлом работать не будем, он никогда не нужен. - -Даже сам объект `document`, формально, является DOM-узлом, самым-самым корневым. - -Всего различают 12 типов узлов, но на практике мы работаем с четырьмя из них: -
          -
        1. Документ -- точка входа в DOM.
        2. -
        3. Элементы -- основные строительные блоки.
        4. -
        5. Текстовые узлы -- содержат, собственно, текст.
        6. -
        7. Комментарии -- иногда в них можно включить информацию, которая не будет показана, но доступна из JS.
        8. -
        - -## Возможности, которые дает DOM - -Зачем, кроме красивых рисунков, нужна иерархическая модель DOM? - -**DOM нужен для того, чтобы манипулировать страницей -- читать информацию из HTML, создавать и изменять элементы.** - -Узел `HTML` можно получить как `document.documentElement`, а `BODY` -- как `document.body`. - -Получив узел, мы можем что-то сделать с ним. - -Например, можно поменять цвет `BODY` и вернуть обратно: - -```js -//+ run -document.body.style.backgroundColor = 'red'; -alert( 'Поменяли цвет BODY' ); - -document.body.style.backgroundColor = ''; -alert( 'Сбросили цвет BODY' ); -``` - -DOM предоставляет возможность делать со страницей всё, что угодно. - -Позже мы более подробно рассмотрим различные свойства и методы DOM-узлов. - - -## Особенности IE8- - -IE8- не генерирует текстовые узлы, если они состоят только из пробелов. - - То есть, такие два документа дадут идентичный DOM: - -```html - - -О лосяхПравда о лосях -``` - -И такой: - -```html - - - - - О лосях - - - - Правда о лосях - - - -``` - -Эта, с позволения сказать, "оптимизация" не соответствует стандарту и IE9+ уже работает как нужно, то есть как описано ранее. - -Но, по большому счёту, для нас это отличие должно быть без разницы, ведь при работе с DOM/HTML мы в любом случае не должны быть завязаны на то, есть пробел между тегами или его нет. Мало ли, сегодня он есть, а завтра решили переформатировать HTML и его не стало. - -К счастью, свойства и методы DOM, которые мы пройдём далее, вполне позволяют писать код, который будет работать корректно во всех версиях браузеров. Так что знать об этом отличии надо, если вы хотите поддерживать старые IE, но проблем оно нам создавать не будет. - -## Итого - -
          -
        • DOM-модель -- это внутреннее представление HTML-страницы в виде дерева.
        • -
        • Все элементы страницы, включая теги, текст, комментарии, являются узлами DOM.
        • -
        • У элементов DOM есть свойства и методы, которые позволяют изменять их.
        • -
        • IE8- не генерирует пробельные узлы.
        • -
        - -Кстати, DOM-модель используется не только в JavaScript, это известный способ представления XML-документов. - -В следующих главах мы познакомимся с DOM более плотно. - -[libs] -d3 -domtree -[/libs] \ No newline at end of file diff --git a/2-ui/1-document/3-dom-console/1.png b/2-ui/1-document/3-dom-console/1.png deleted file mode 100644 index 6ba0e56d08dc91449dd4a7df1d227a94ee935fef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28286 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 z 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
        0w#*7MpC#D54b=HAWmtI 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 XmDJe7a}jP(00000NkvXXu0mjfx?PA( diff --git a/2-ui/1-document/3-dom-console/2.png b/2-ui/1-document/3-dom-console/2.png deleted file mode 100644 index 260e183cbbe1e22822ba10866cc384007e857ffb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28260 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 diff --git a/2-ui/1-document/3-dom-console/2@2x.png b/2-ui/1-document/3-dom-console/2@2x.png deleted file mode 100755 index 4159c07b48ce76d1a68a4ed2777ee7b46bbffe00..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44086 zcmcF~Ra9I})9&C7!3PV$oeb^}+}#N>xLdH`1b2cD?(XjH?ry<7I0=4uzxVrZ&VO|- z&a7E$c6E1EKULMcc1=x9n394d8Zsd=002OfmJ(9|0ARrY0CXiH%=^g7PO9nq2dufU zyf6Sz6NB<>2=`7yIjKmB04gVmkKb3mD9NdbzrDR(U0q#VT>Sq1`}+F&^78VH8gOuM z@CE?P&(EKqpO21?c64-XZEbCDZ}0Bzz6)7cSeTuiJv%$w-``(eUY?tqv$L~XTwGjR zTU%dWUtL|@+}zyQ*x1?GnVFe6Jw4sq+nbu2T3K1Ku&{V~dR|&uQc_ZSdwnf0FaPuB z@9pg^!0YYh<>l`Feqv&xr>FPm=$M(AIWI4-pr9ZO#(!vVu(h?dp`l@5U;v0xq7}Va zTwGjPSy^3Ojf;!>@bDlYAn-do?v)4c`3uSG&ibp9&Pq+mlMKVb%tT^hA_xTX@bHL< zi6;0;kRk~f85!2m(NR!PxCa1yeEmW~g6&) -po@3yY-t&fjS3+)LmE-qn%Zw+&s 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�^lfj5K!=o(m!=_3IS{}$Fjk_H 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

        bePlMU!9ps{>{{ry9pK^Cv&T)E)$( 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 l?qkG*Wb0A -

      • Выберите его во вкладке Elements.
      • -
      • ...Либо внизу вкладки Elements есть лупа, при нажатии на которую можно выбрать элемент кликом.
      • -
      • ...Либо, что обычно удобнее всего, просто кликните на нужном месте на странице правой кнопкой и выберите в меню "Проверить Элемент".
      • - - - - -Справа будет различная информация об элементе: -
        -
        Computed Style
        -
        Итоговые свойства CSS элемента, которые он приобрёл в результате применения всего каскада стилей, включая внешние CSS-файлы и атрибут `style`.
        -
        Style
        -
        Каскад стилей, применённый к элементу. Каждое стилевое правило отдельно, здесь же можно менять стили кликом.
        -
        Metrics
        -
        Размеры элемента.
        -
        ...
        -
        И еще некоторые реже используемые вкладки, которые станут понятны по мере изучения DOM.
        -
        - -[warn header="DOM в Elements не совсем соответствует реальному"] -Отображение DOM во вкладке Elements не совсем соответствует реальному. В частности, там не отображаются пробельные узлы. Это сделано для удобства просмотра. Но мы-то знаем, что они есть. - -С другой стороны, в Elements можно увидеть CSS-псевдоэлементы, такие как `::before`, `::after`. Это также сделано для удобства, в DOM их не существует. -[/warn] - - -## Выбранные элементы $0 $1... - -Зачастую бывает нужно выбрать элемент DOM и сделать с ним что-то на JavaScript. - -Находясь во вкладке Elements, откройте консоль нажатием Esc (или перейдите на вкладку Console). - -**Последний элемент, выбранный во вкладке Elements, доступен в консоли как `$0`, предыдущий -- `$1` и так далее.** - -Запустите на элементе команду, которая делает его красным: - -```js -$0.style.backgroundColor = 'red'; -``` - -В браузере это может выглядеть примерно так: - - - -Мы выделили элемент, применили к нему JavaScript в консоли, тут же увидели изменения в браузере. - -Есть и обратная дорожка. Любой элемент из JS-переменной можно посмотреть во вкладке Elements, для этого: - -
          -
        1. Выведите эту переменную в консоли, например при помощи `console.log`.
        2. -
        3. Кликните на выводе в консоли правой кнопкой мыши.
        4. -
        5. Выберите соответствующий пункт меню.
        6. -
        - - - -Таким образом, можно легко перемещаться из Elements в консоль и обратно. - -## Ещё методы консоли - -Для поиска элементов в консоли есть два специальных метода: -
          -
        • `$$("div.my")` -- ищет все элементы в DOM по данному CSS-селектору.
        • -
        • `$("div.my")` -- ищет первый элемент в DOM по данному CSS-селектору.
        • -
        - -Более полная документация по методам консоли доступна на страницах [Console API Reference для Chrome](https://developers.google.com/web/tools/chrome-devtools/debug/console/console-reference) и [Command Line API для Firebug](https://getfirebug.com/wiki/index.php/Command_Line_API), а также на [firebug.ru](http://firebug.ru). - -Другие браузеры реализуют похожий функционал, освоив Chrome/Firebug, вы легко с ними разберётесь. diff --git a/2-ui/1-document/3-dom-console/losi.html b/2-ui/1-document/3-dom-console/losi.html deleted file mode 100644 index 06f8da0d..00000000 --- a/2-ui/1-document/3-dom-console/losi.html +++ /dev/null @@ -1,13 +0,0 @@ - - - - - Правда о лосях -
          -
        1. Лось — животное хитрое
        2. - -
        3. ..И коварное!
        4. -
        - - - \ No newline at end of file diff --git a/2-ui/1-document/4-traversing-dom/1-dom-children/solution.md b/2-ui/1-document/4-traversing-dom/1-dom-children/solution.md deleted file mode 100644 index e620832e..00000000 --- a/2-ui/1-document/4-traversing-dom/1-dom-children/solution.md +++ /dev/null @@ -1,32 +0,0 @@ -# HEAD - -Два способа: - -```js -document.documentElement.children[0] -document.documentElement.firstChild -``` - -Второй способ работает, так как пробелы перед `` игнорируются. - -Также в современных браузерах доступен `document.head`. - -# UL - -Например, так: - -```js -document.body.children[1] -``` - -# LI - -Можно так: - -```js -document.body.children[1].children[1]; // LI -``` - -Может возникнуть проблема с комментарием в IE8-, так как он станет одним из `children`, в результате последний код станет работать некорректно. - -В последующих разделах учебника мы рассмотрим другие методы поиска по DOM, которые позволят эту проблему обойти. \ No newline at end of file diff --git a/2-ui/1-document/4-traversing-dom/1-dom-children/task.md b/2-ui/1-document/4-traversing-dom/1-dom-children/task.md deleted file mode 100644 index 21e85842..00000000 --- a/2-ui/1-document/4-traversing-dom/1-dom-children/task.md +++ /dev/null @@ -1,38 +0,0 @@ -# DOM children - -[importance 5] - -Для страницы: - -```html - - - - - - - - -
        Пользователи:
        -
          -
        • Маша
        • -
        • Вовочка
        • -
        - - - - - - - - -``` - -
          -
        • Напишите код, который получит элемент `HEAD`.
        • -
        • Напишите код, который получит `UL`.
        • -
        • Напишите код, который получит второй `LI`. Будет ли ваш код работать в IE8-, если комментарий переместить *между* элементами `LI`?
        • -
        - diff --git a/2-ui/1-document/4-traversing-dom/2-has-childnodes/solution.md b/2-ui/1-document/4-traversing-dom/2-has-childnodes/solution.md deleted file mode 100644 index 07ee2da5..00000000 --- a/2-ui/1-document/4-traversing-dom/2-has-childnodes/solution.md +++ /dev/null @@ -1,28 +0,0 @@ -Вначале нерабочие способы, которые могут прийти на ум: - -```js -//+ no-beautify -if (!elem) { .. } -``` - -Это не работает, так как `elem` всегда есть, и является объектом. Так что проверка `if (elem)` всегда верна, вне зависимости от того, есть ли у `elem` потомки. - -```js -//+ no-beautify -if (!elem.childNodes) { ... } -``` - -Тоже не работает, так как псевдо-массив `childNodes` всегда существует. Он может быть пуст или непуст, но он всегда является объектом, так что проверка `if (elem.childNodes)` всегда верна. - -Несколько рабочих способов: - -```js -//+ no-beautify -if (!elem.childNodes.length) { ... } - -if (!elem.firstChild) { ... } - -if (!elem.lastChild) { ... } -``` - -Также существует метод [hasChildNodes](https://developer.mozilla.org/en-US/docs/Web/API/Node.hasChildNodes), который позволяет вызовом `elem.hasChildNodes()` определить наличие детей. Он работает так же, как проверка `elem.childNodes.length != 0`. \ No newline at end of file diff --git a/2-ui/1-document/4-traversing-dom/2-has-childnodes/task.md b/2-ui/1-document/4-traversing-dom/2-has-childnodes/task.md deleted file mode 100644 index 7532f1fc..00000000 --- a/2-ui/1-document/4-traversing-dom/2-has-childnodes/task.md +++ /dev/null @@ -1,14 +0,0 @@ -# Проверка существования детей - -[importance 5] - -Придумайте самый короткий код для проверки, пуст ли элемент `elem`. - -"Пустой" -- значит нет дочерних узлов, даже текстовых. - -```js -//+ no-beautify -if (/*...ваш код проверки elem... */) { узел elem пуст } -``` - -Что написать в условии `if` ? \ No newline at end of file diff --git a/2-ui/1-document/4-traversing-dom/3-navigation-links-which-null/solution.md b/2-ui/1-document/4-traversing-dom/3-navigation-links-which-null/solution.md deleted file mode 100644 index ca09870b..00000000 --- a/2-ui/1-document/4-traversing-dom/3-navigation-links-which-null/solution.md +++ /dev/null @@ -1,10 +0,0 @@ -
          -
        1. Да, верно, с оговоркой. Элемент `elem.lastChild` последний, у него нет правого соседа. - -**Оговорка:** `elem.lastChild.nextSibling` выдаст ошибку если `elem` не имеет детей. -
        2. -
        3. Нет, неверно, это может быть текстовый узел. Значением `elem.children[0]` является первый узел-элемент, перед ним может быть текст. - -Аналогично предыдущему случаю, если у `elem` нет детей-элементов -- будет ошибка. -
        4. - diff --git a/2-ui/1-document/4-traversing-dom/3-navigation-links-which-null/task.md b/2-ui/1-document/4-traversing-dom/3-navigation-links-which-null/task.md deleted file mode 100644 index 993d7d8b..00000000 --- a/2-ui/1-document/4-traversing-dom/3-navigation-links-which-null/task.md +++ /dev/null @@ -1,9 +0,0 @@ -# Вопрос по навигационным ссылкам - -[importance 5] - -Если `elem` -- это произвольный узел DOM... - -Верно ли, что `elem.lastChild.nextSibling` всегда `null`? - -Верно ли, что `elem.children[0].previousSibling` всегда `null` ? \ No newline at end of file diff --git a/2-ui/1-document/4-traversing-dom/4-select-diagonal-cells/solution.md b/2-ui/1-document/4-traversing-dom/4-select-diagonal-cells/solution.md deleted file mode 100644 index 27da4a11..00000000 --- a/2-ui/1-document/4-traversing-dom/4-select-diagonal-cells/solution.md +++ /dev/null @@ -1 +0,0 @@ -Для удобства работы с таблицей используем специальные свойства `rows` и `cells`. \ No newline at end of file diff --git a/2-ui/1-document/4-traversing-dom/4-select-diagonal-cells/solution.view/index.html b/2-ui/1-document/4-traversing-dom/4-select-diagonal-cells/solution.view/index.html deleted file mode 100644 index fc03772e..00000000 --- a/2-ui/1-document/4-traversing-dom/4-select-diagonal-cells/solution.view/index.html +++ /dev/null @@ -1,66 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
          1:12:13:14:15:1
          1:22:23:24:25:2
          1:32:33:34:35:3
          1:42:43:44:45:4
          1:52:53:54:55:5
          - - - - \ No newline at end of file diff --git a/2-ui/1-document/4-traversing-dom/4-select-diagonal-cells/source.view/index.html b/2-ui/1-document/4-traversing-dom/4-select-diagonal-cells/source.view/index.html deleted file mode 100644 index d9b40920..00000000 --- a/2-ui/1-document/4-traversing-dom/4-select-diagonal-cells/source.view/index.html +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
          1:12:13:14:15:1
          1:22:23:24:25:2
          1:32:33:34:35:3
          1:42:43:44:45:4
          1:52:53:54:55:5
          - - - - \ No newline at end of file diff --git a/2-ui/1-document/4-traversing-dom/4-select-diagonal-cells/task.md b/2-ui/1-document/4-traversing-dom/4-select-diagonal-cells/task.md deleted file mode 100644 index 92034c40..00000000 --- a/2-ui/1-document/4-traversing-dom/4-select-diagonal-cells/task.md +++ /dev/null @@ -1,17 +0,0 @@ -# Выделите ячейки по диагонали - -[importance 5] - -Напишите код, который выделит все ячейки в таблице по диагонали. - -Вам нужно будет получить из таблицы `table` все диагональные `td` и выделить их, используя код: - -```js -// в переменной td DOM-элемент для тега -td.style.backgroundColor = 'red'; -``` - -Должно получиться так: -[iframe src="solution" height=180] - - diff --git a/2-ui/1-document/4-traversing-dom/article.md b/2-ui/1-document/4-traversing-dom/article.md deleted file mode 100644 index 13ef881a..00000000 --- a/2-ui/1-document/4-traversing-dom/article.md +++ /dev/null @@ -1,433 +0,0 @@ -# Навигация по DOM-элементам - -DOM позволяет делать что угодно с HTML-элементом и его содержимым, но для этого нужно сначала нужный элемент получить. - -Доступ к DOM начинается с объекта `document`. Из него можно добраться до любых узлов. - -[cut] - -Так выглядят основные ссылки, по которым можно переходить между узлами DOM: - - - -Посмотрим на них повнимательнее. - -## Сверху documentElement и body - -Самые верхние элементы дерева доступны напрямую из `document`. - -
          -
          `` = `document.documentElement`
          -
          Первая точка входа -- `document.documentElement`. Это свойство ссылается на DOM-объект для тега ``.
          -
          `` = `document.body`
          -
          Вторая точка входа -- `document.body`, который соответствует тегу ``.
          -
          - -В современных браузерах (кроме IE8-) также есть `document.head` -- прямая ссылка на `` - -[warn header="Есть одна тонкость: `document.body` может быть равен `null`"] -Нельзя получить доступ к элементу, которого еще не существует в момент выполнения скрипта. - -В частности, если скрипт находится в ``, то в нём недоступен `document.body`. - -Поэтому в следующем примере первый `alert` выведет `null`: - -```html - - - - - - - - - - - - - - - -``` -[/warn] - -[smart header="В DOM активно используется `null`"] -В мире DOM в качестве значения, обозначающего "нет такого элемента" или "узел не найден", используется не `undefined`, а `null`. -[/smart] - - -## Дети: childNodes, firstChild, lastChild - -Здесь и далее мы будем использовать два принципиально разных термина. - -
            -
          • **Дочерние элементы (или дети)** -- элементы, которые лежат *непосредственно* внутри данного. Например, внутри `` обычно лежат `` и ``.
          • -
          • **Потомки** -- все элементы, которые лежат внутри данного, вместе с их детьми, детьми их детей и так далее. То есть, всё поддерево DOM.
          • -
          - -Псевдо-массив `childNodes` хранит все дочерние элементы, включая текстовые. - -Пример ниже последовательно выведет дочерние элементы `document.body`: - -```html - - - - - -
          Начало
          - -
            -
          • Информация
          • -
          - -
          Конец
          - - - ... - - - -``` - -Обратим внимание на маленькую деталь. Если запустить пример выше, то последним будет выведен элемент ` - ... - - - -``` - -Всегда верны равенства: - -```js -elem.firstElementChild === elem.children[0] -elem.lastElementChild === elem.children[elem.children.length - 1] -``` - - -[warn header="В IE8- поддерживается только `children`"] -Других навигационных свойств в этих браузерах нет. Впрочем, как мы увидим далее, можно легко сделать полифилл, и они, всё же, будут. -[/warn] - - -[warn header="В IE8- в `children` присутствуют узлы-комментарии"] -С точки зрения стандарта это ошибка, но IE8- также включает в `children` узлы, соответствующие HTML-комментариям. - -Это может привести к сюрпризам при использовании свойства `children`, поэтому HTML-комментарии либо убирают либо используют фреймворк, к примеру, jQuery, который даёт свои методы перебора и отфильтрует их. -[/warn] - -## Особые ссылки для таблиц [#dom-navigation-tables] - -У конкретных элементов DOM могут быть свои дополнительные ссылки для большего удобства навигации. - -Здесь мы рассмотрим таблицу, так как это важный частный случай и просто для примера. - -В списке ниже выделены наиболее полезные: - -
          -
          `TABLE`
          -
          -
            -
          • **`table.rows`** -- коллекция строк `TR` таблицы.
          • -
          • `table.caption/tHead/tFoot` -- ссылки на элементы таблицы `CAPTION`, `THEAD`, `TFOOT`.
          • -
          • `table.tBodies` -- коллекция элементов таблицы `TBODY`, по спецификации их может быть несколько.
          • -
          -
          `THEAD/TFOOT/TBODY`
          -
          -
            -
          • `tbody.rows` -- коллекция строк `TR` секции.
          • -
          -
          `TR`
          -
          -
            -
          • **`tr.cells`** -- коллекция ячеек `TD/TH`
          • -
          • **`tr.sectionRowIndex`** -- номер строки в текущей секции `THEAD/TBODY`
          • -
          • `tr.rowIndex` -- номер строки в таблице
          • -
          -
          -
          `TD/TH`
          -
          -
            -
          • **`td.cellIndex`** -- номер ячейки в строке
          • -
          -
          -
          - -Пример использования: - -```html - - - - - - - - -
          один два
          три четыре
          - - -``` - -Спецификация: [HTML5: tabular data](http://www.w3.org/TR/html5/tabular-data.html). - -Даже если эти свойства не нужны вам прямо сейчас, имейте их в виду на будущее, когда понадобится пройтись по таблице. - -Конечно же, таблицы -- не исключение. - -Аналогичные полезные свойства есть у HTML-форм, они позволяют из формы получить все её элементы, а из них -- в свою очередь, форму. Мы рассмотрим их позже. - -[online] -# Интерактивное путешествие - -Для того, чтобы убедиться, что вы разобрались с навигацией по DOM-ссылкам -- вашему вниманию предлагается интерактивное путешествие по DOM. - -Ниже вы найдёте документ (в ифрейме), и кнопки для перехода по нему. - -Изначальный элемент -- ``. Попробуйте по ссылкам найти "информацию". Или ещё чего-нибудь. - -Вы также можете открыть документ [в отдельном окне](travel/) и походить по нему в браузерной консоли разработчика, чтобы лучше понять разницу между показанным там DOM и реальным. - -Разметка: - -[html src="travel/index.html"/] - -Документ: - -[iframe samedomain id="travel-dom-iframe" src="travel" height=150] - -
          - -Навигация: -
            -
          • -
              -
            • -
            • Здесь стоите вы -
                -
              • -
              • -
              -
            • -
            • -
            -
          • -
          - -
          - - -
          - - -[/online] - -# Итого - -В DOM доступна навигация по соседним узлам через ссылки: -
            -
          • По любым узлам.
          • -
          • Только по элементам.
          • -
          - -Также некоторые виды элементов предоставляют дополнительные ссылки для большего удобства, например у таблиц есть свойства для доступа к строкам/ячейкам. - -[libs] -d3 -domtree -[/libs] -[head] - - -[/head] - diff --git a/2-ui/1-document/4-traversing-dom/dom-links-elements.png b/2-ui/1-document/4-traversing-dom/dom-links-elements.png deleted file mode 100644 index ee1516d40fdaf5dd432aac50699a8d2e9ba13207..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33183 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

          x=a#f8kYm?4YfZ3ZYRJbcVXNwb>oq`%X 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 diff --git a/2-ui/1-document/4-traversing-dom/dom-links-elements@2x.png b/2-ui/1-document/4-traversing-dom/dom-links-elements@2x.png deleted file mode 100644 index 42b8549ab2f497d2faa6bac7dc425f9b12efe9a4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 69465 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 F{{ydJ;@JQI diff --git a/2-ui/1-document/4-traversing-dom/dom-links.png b/2-ui/1-document/4-traversing-dom/dom-links.png deleted file mode 100644 index a3371ab0861b413e75e4fb7e2c78207692e17230..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 31564 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%0Db=7?XI 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 diff --git a/2-ui/1-document/4-traversing-dom/dom-links@2x.png b/2-ui/1-document/4-traversing-dom/dom-links@2x.png deleted file mode 100644 index b5e3a4e7e156d718462aecac4df1a51a14698047..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 68508 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

          5k;EjQE`)Xg!?AI&bebqgq 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 - - - - Документ - - -

          - -
            -
          • - Осторожно -
          • -
          • - -
          - - - - \ No newline at end of file diff --git a/2-ui/1-document/5-searching-elements-dom/1-find-elements/solution.md b/2-ui/1-document/5-searching-elements-dom/1-find-elements/solution.md deleted file mode 100644 index 210933da..00000000 --- a/2-ui/1-document/5-searching-elements-dom/1-find-elements/solution.md +++ /dev/null @@ -1,26 +0,0 @@ -Есть много вариантов решения, вот некоторые из них: - -```js -// 1 -document.getElementById('age-table').getElementsByTagName('label'); - -// 2 -document.getElementById('age-table').getElementsByTagName('td')[0]; -// в современных браузерах можно одним запросом: -var result = document.querySelector('#age-table td'); - -// 3 -document.getElementsByTagName('form')[1]; - -// 4 -document.querySelector('form[name="search"]'); - -// 5 -document.querySelector('form[name="search"] input') - -// 6 -document.getElementsByName("info[0]")[0]; - -// 7 -document.querySelector('form[name="search-person"] [name="info[0]"]'); -``` diff --git a/2-ui/1-document/5-searching-elements-dom/1-find-elements/table.html b/2-ui/1-document/5-searching-elements-dom/1-find-elements/table.html deleted file mode 100644 index 3484bc0c..00000000 --- a/2-ui/1-document/5-searching-elements-dom/1-find-elements/table.html +++ /dev/null @@ -1,48 +0,0 @@ - - - - - - - - -
          - - -
          - -
          - -
          - Поиск по посетителям: - - - - - - - - - - - -
          Возраст: - - - -
          Дополнительно: - - - -
          - - -
          - - - \ No newline at end of file diff --git a/2-ui/1-document/5-searching-elements-dom/1-find-elements/task.md b/2-ui/1-document/5-searching-elements-dom/1-find-elements/task.md deleted file mode 100644 index fa959a95..00000000 --- a/2-ui/1-document/5-searching-elements-dom/1-find-elements/task.md +++ /dev/null @@ -1,20 +0,0 @@ -# Поиск элементов - -[importance 4] - -Ниже находится документ с таблицей и формой. - -Найдите (получите в переменную) в нём: - -
            -
          1. Все элементы `label` внутри таблицы. Должно быть 3 элемента.
          2. -
          3. Первую ячейку таблицы (со словом `"Возраст"`).
          4. -
          5. Вторую форму в документе.
          6. -
          7. Форму с именем `search`, без использования её позиции в документе.
          8. -
          9. Элемент `input` в форме с именем `search`. Если их несколько, то нужен первый.
          10. -
          11. Элемент с именем `info[0]`, без точного знания его позиции в документе.
          12. -
          13. Элемент с именем `info[0]`, внутри формы с именем `search-person`.
          14. -
          - -Используйте для этого консоль браузера, открыв страницу [table.html](table.html) в отдельном окне. - diff --git a/2-ui/1-document/5-searching-elements-dom/2-tree-info/solution.md b/2-ui/1-document/5-searching-elements-dom/2-tree-info/solution.md deleted file mode 100644 index 55b45737..00000000 --- a/2-ui/1-document/5-searching-elements-dom/2-tree-info/solution.md +++ /dev/null @@ -1,18 +0,0 @@ -Сделаем цикл по узлам `
        5. `: - -```js -var lis = document.getElementsByTagName('li'); - -for (i = 0; i < lis.length; i++) { - ... -} -``` - -В цикле для каждого `lis[i]` можно получить текст, используя свойство `firstChild`. Ведь первым в `
        6. ` является как раз текстовый узел, содержащий текст названия. - -Также можно получить количество потомков, используя `lis[i].getElementsByTagName('li')`. - -Напишите код с этой подсказкой. - -Если уж не выйдет -- тогда откройте решение. - diff --git a/2-ui/1-document/5-searching-elements-dom/2-tree-info/solution.view/index.html b/2-ui/1-document/5-searching-elements-dom/2-tree-info/solution.view/index.html deleted file mode 100644 index e9b5d644..00000000 --- a/2-ui/1-document/5-searching-elements-dom/2-tree-info/solution.view/index.html +++ /dev/null @@ -1,66 +0,0 @@ - - - - - - - - - -
            -
          • Животные -
              -
            • Млекопитающие -
                -
              • Коровы
              • -
              • Ослы
              • -
              • Собаки
              • -
              • Тигры
              • -
              -
            • -
            • Другие -
                -
              • Змеи
              • -
              • Птицы
              • -
              • Ящерицы
              • -
              -
            • -
            -
          • -
          • Рыбы -
              -
            • Аквариумные -
                -
              • Гуппи
              • -
              • Скалярии
              • -
              - -
            • -
            • Морские -
                -
              • Морская форель
              • -
              -
            • -
            -
          • -
          - - - - - - \ No newline at end of file diff --git a/2-ui/1-document/5-searching-elements-dom/2-tree-info/source.view/index.html b/2-ui/1-document/5-searching-elements-dom/2-tree-info/source.view/index.html deleted file mode 100644 index 2f45460c..00000000 --- a/2-ui/1-document/5-searching-elements-dom/2-tree-info/source.view/index.html +++ /dev/null @@ -1,54 +0,0 @@ - - - - - - - - - -
            -
          • Животные -
              -
            • Млекопитающие -
                -
              • Коровы
              • -
              • Ослы
              • -
              • Собаки
              • -
              • Тигры
              • -
              -
            • -
            • Другие -
                -
              • Змеи
              • -
              • Птицы
              • -
              • Ящерицы
              • -
              -
            • -
            -
          • -
          • Рыбы -
              -
            • Аквариумные -
                -
              • Гуппи
              • -
              • Скалярии
              • -
              - -
            • -
            • Морские -
                -
              • Морская форель
              • -
              -
            • -
            -
          • -
          - - - - - - \ No newline at end of file diff --git a/2-ui/1-document/5-searching-elements-dom/2-tree-info/task.md b/2-ui/1-document/5-searching-elements-dom/2-tree-info/task.md deleted file mode 100644 index 5ffd808d..00000000 --- a/2-ui/1-document/5-searching-elements-dom/2-tree-info/task.md +++ /dev/null @@ -1,14 +0,0 @@ -# Дерево - -[importance 5] - -Есть дерево из тегов `
      • ` количество вложенных в него элементов. Узлы нижнего уровня, без детей -- пропускайте. - -Результат: -[iframe border=1 src="solution"] diff --git a/2-ui/1-document/11-modifying-document/9-calendar-table/solution.md b/2-ui/1-document/11-modifying-document/9-calendar-table/solution.md deleted file mode 100644 index a4e1a7f3..00000000 --- a/2-ui/1-document/11-modifying-document/9-calendar-table/solution.md +++ /dev/null @@ -1,11 +0,0 @@ -Для решения задачи сгенерируем таблицу в виде строки: `"...
        "`, а затем присвоим в `innerHTML`. - -Алгоритм: -
          -
        1. Создать объект даты `d = new Date(year, month-1)`. Это первый день месяца `month` (с учетом того, что месяцы в JS начинаются от 0, а не от 1).
        2. -
        3. Ячейки первого ряда пустые от начала и до дня недели `d.getDay()`, с которого начинается месяц. Создадим их.
        4. -
        5. Увеличиваем день в `d` на единицу: `d.setDate(d.getDate()+1)`, и добавляем в календарь очередную ячейку, пока не достигли следующего месяца. При этом последний день недели означает вставку перевода строки "</tr><tr>".
        6. -
        7. При необходимости, если календарь окончился не на воскресенье - добавить пустые `TD` в таблицу, чтобы было все ровно.
        8. -
        - -[edit src="solution"]Открыть полное решение[/edit] diff --git a/2-ui/1-document/11-modifying-document/9-calendar-table/solution.view/index.html b/2-ui/1-document/11-modifying-document/9-calendar-table/solution.view/index.html deleted file mode 100644 index e0a7443c..00000000 --- a/2-ui/1-document/11-modifying-document/9-calendar-table/solution.view/index.html +++ /dev/null @@ -1,84 +0,0 @@ - - - - - - - - - - - -
        - - - - - - \ No newline at end of file diff --git a/2-ui/1-document/11-modifying-document/9-calendar-table/source.view/index.html b/2-ui/1-document/11-modifying-document/9-calendar-table/source.view/index.html deleted file mode 100644 index 2eedf93e..00000000 --- a/2-ui/1-document/11-modifying-document/9-calendar-table/source.view/index.html +++ /dev/null @@ -1,41 +0,0 @@ - - - - - - - - - - - -
        - - - - - \ No newline at end of file diff --git a/2-ui/1-document/11-modifying-document/9-calendar-table/task.md b/2-ui/1-document/11-modifying-document/9-calendar-table/task.md deleted file mode 100644 index 264fcf6c..00000000 --- a/2-ui/1-document/11-modifying-document/9-calendar-table/task.md +++ /dev/null @@ -1,19 +0,0 @@ -# Создать календарь в виде таблицы - -[importance 4] - -Напишите функцию, которая умеет генерировать календарь для заданной пары (месяц, год). - -Календарь должен быть таблицей, где каждый день -- это `TD`. У таблицы должен быть заголовок с названиями дней недели, каждый день -- `TH`. - -Синтаксис: `createCalendar(id, year, month)`. - -Такой вызов должен генерировать текст для календаря месяца `month` в году `year`, а затем помещать его внутрь элемента с указанным `id`. - -Например: `createCalendar("cal", 2012, 9)` сгенерирует в <div id='cal'></div> следующий календарь: - -[iframe height=210 src="solution"] - -P.S. Достаточно сгенерировать календарь, кликабельным его делать не нужно. - - diff --git a/2-ui/1-document/11-modifying-document/article.md b/2-ui/1-document/11-modifying-document/article.md deleted file mode 100644 index d1cf7a43..00000000 --- a/2-ui/1-document/11-modifying-document/article.md +++ /dev/null @@ -1,412 +0,0 @@ -# Добавление и удаление узлов - -Изменение DOM -- ключ к созданию "живых" страниц. - -В этой главе мы рассмотрим, как создавать новые элементы "на лету" и заполнять их данными. - -[cut] - -## Пример: показ сообщения - -В качестве примера рассмотрим добавление сообщения на страницу, чтобы оно было оформленно красивее чем обычный `alert`. - -HTML-код для сообщения: - -```html - - - -*!* -
        - Ура! Вы прочитали это важное сообщение. -
        -*/!* -``` - -## Создание элемента - -Для создания элементов используются следующие методы: - -
        -
        `document.createElement(tag)`
        -
        Создает новый элемент с указанным тегом: - -```js -var div = document.createElement('div'); -``` - -
        -
        `document.createTextNode(text)`
        -
        Создает новый *текстовый* узел с данным текстом: - -```js -var textElem = document.createTextNode('Тут был я'); -``` - -
        - -### Создание сообщения - -В нашем случае мы хотим сделать DOM-элемент `div`, дать ему классы и заполнить текстом: - -```js -var div = document.createElement('div'); -div.className = "alert alert-success"; -div.innerHTML = "Ура! Вы прочитали это важное сообщение."; -``` - -После этого кода у нас есть готовый DOM-элемент. Пока что он присвоен в переменную `div`, но не виден, так как никак не связан со страницей. - -## Добавление элемента: appendChild, insertBefore - -Чтобы DOM-узел был показан на странице, его необходимо вставить в `document`. - -Для этого первым делом нужно решить, куда мы будем его вставлять. Предположим, что мы решили, что вставлять будем в некий элемент `parentElem`, например `var parentElem = document.body`. - -Для вставки внутрь `parentElem` есть следующие методы: - -
        -
        `parentElem.appendChild(elem)`
        -
        Добавляет `elem` в конец дочерних элементов `parentElem`. - -Следующий пример добавляет новый элемент в конец `
          `: - -```html - -
            -
          1. 0
          2. -
          3. 1
          4. -
          5. 2
          6. -
          - - -``` - -
        -
        `parentElem.insertBefore(elem, nextSibling)`
        -
        Вставляет `elem` в коллекцию детей `parentElem`, перед элементом `nextSibling`. - -Следующий код вставляет новый элемент перед вторым `
      • `: - -```html - -
          -
        1. 0
        2. -
        3. 1
        4. -
        5. 2
        6. -
        - -``` - -Для вставки элемента в начало достаточно указать, что вставлять будем перед первым потомком: - -```js -list.insertBefore(newLi, list.firstChild); -``` - -У читателя, который посмотрит на этот код внимательно, наверняка возникнет вопрос: "А что, если `list` вообще пустой, в этом случае ведь `list.firstChild = null`, произойдёт ли вставка?" - -Ответ -- да, произойдёт. - -**Дело в том, что если вторым аргументом указать `null`, то `insertBefore` сработает как `appendChild`:** - -```js -parentElem.insertBefore(elem, null); -// то же, что и: -parentElem.appendChild(elem) -``` - -Так что `insertBefore` универсален. -
      • -
        - -[smart] -Все методы вставки возвращают вставленный узел. - -Например, `parentElem.appendChild(elem)` возвращает `elem`. -[/smart] - - -### Пример использования - -Добавим сообщение в конец ``: - -```html - - - - -

        Моя страница

        - - - -``` - -...А теперь -- в начало ``: - -```html - - - - -

        Моя страница

        - - - -``` - -## Клонирование узлов: cloneNode - -А как бы вставить второе похожее сообщение? - -Конечно, можно сделать функцию для генерации сообщений и поместить туда этот код, но в ряде случаев гораздо эффективнее -- *клонировать* существующий `div`, а потом изменить текст внутри. В частности, если элемент большой, то клонировать его будет гораздо быстрее, чем пересоздавать. - -Вызов `elem.cloneNode(true)` создаст "глубокую" копию элемента -- вместе с атрибутами, включая подэлементы. Если же вызвать с аргументом `false`, то копия будет сделана без дочерних элементов. Это нужно гораздо реже. - -Пример со вставкой копии сообщения: - -```html - - - - -

        Моя страница

        - - - -``` - -Обратите внимание на последнюю строку, которая вставляет `div2` после `div`: - -```js -div.parentNode.insertBefore(div2, div.nextSibling); -``` - -
          -
        1. Для вставки нам нужен будущий родитель. Мы, возможно, не знаем, где точно находится `div` (или не хотим зависеть от того, где он), но если нужно вставить рядом с `div`, то родителем определённо будет `div.parentNode`.
        2. -
        3. Мы хотели бы вставить *после* `div`, но метода `insertAfter` нет, есть только `insertBefore`, поэтому вставляем *перед* его правым соседом `div.nextSibling`.
        4. -
        - - -## Удаление узлов: removeChild - -Для удаления узла есть два метода: - -
        -
        `parentElem.removeChild(elem)`
        -
        Удаляет `elem` из списка детей `parentElem`.
        -
        `parentElem.replaceChild(newElem, elem)`
        -
        Среди детей `parentElem` удаляет `elem` и вставляет на его место `newElem`.
        -
        - -Оба этих метода возвращают удаленный узел, то есть `elem`. Если нужно, его можно вставить в другое место DOM тут же или в будущем. - -[smart] -Если вы хотите *переместить* элемент на новое место -- не нужно его удалять со старого. - -**Все методы вставки автоматически удаляют вставляемый элемент со старого места.** - -Конечно же, это очень удобно. - -Например, поменяем элементы местами: - -```html - -
        Первый
        -
        Второй
        - -``` - -[/smart] - - -[smart header="Метод `remove`"] - -В современном стандарте есть также метод [elem.remove()](https://dom.spec.whatwg.org/#dom-childnode-remove), который удаляет элемент напрямую, не требуя ссылки на родителя. Это зачастую удобнее, чем `removeChild`. - -Он поддерживается во всех современных браузерах, кроме IE11-. Впрочем, легко подключить или даже сделать полифилл. -[/smart] - -### Удаление сообщения - -Сделаем так, что через секунду сообщение пропадёт: - -```html - - - - -

        Сообщение пропадёт через секунду

        - - - -``` - -## Текстовые узлы для вставки текста - -При работе с сообщением мы использовали только узлы-элементы и `innerHTML`. - -Но и текстовые узлы тоже имеют интересную область применения! - -Если текст для сообщения нужно показать именно как текст, а не как HTML, то можно обернуть его в текстовый узел. - -Например: - -```html - - - - -``` - -В современных браузерах (кроме IE8-) в качестве альтернативы можно использовать присвоение `textContent`. - - -## Итого - -Методы для создания узлов: - -
          -
        • `document.createElement(tag)` -- создает элемент
        • -
        • `document.createTextNode(value)` -- создает текстовый узел
        • -
        • `elem.cloneNode(deep)` -- клонирует элемент, если `deep == true`, то со всеми потомками, если `false` -- без потомков.
        • -
        - -Вставка и удаление узлов: -
          -
        • `parent.appendChild(elem)`
        • -
        • `parent.insertBefore(elem, nextSibling)`
        • -
        • `parent.removeChild(elem)`
        • -
        • `parent.replaceChild(newElem, elem)`
        • -
        - -Все эти методы возвращают `elem`. - -Методы для изменения DOM также описаны в спецификации
        DOM Level 1. - - - - - - - diff --git a/2-ui/1-document/12-multi-insert/1-append-to-list/solution.md b/2-ui/1-document/12-multi-insert/1-append-to-list/solution.md deleted file mode 100644 index f8202293..00000000 --- a/2-ui/1-document/12-multi-insert/1-append-to-list/solution.md +++ /dev/null @@ -1,8 +0,0 @@ -Решение: - -```js -var ul = document.body.children[0]; - -ul.insertAdjacentHTML("beforeEnd", "