From a0906ea9aed3ee3b5a8a7232173f44e7c53dfef5 Mon Sep 17 00:00:00 2001 From: Beth Griggs Date: Sun, 28 Jun 2020 00:32:12 +0100 Subject: [PATCH] chapters: delete old chapter samples --- .../debugging-with-devtools/app/future.js | 3 - .../debugging-with-devtools/app/index.js | 10 - .../debugging-with-devtools/app/package.json | 15 - Chapter01/debugging-with-devtools/app/past.js | 3 - .../enabling-core-debug-logs/app/index.js | 11 - .../enabling-core-debug-logs/app/package.json | 15 - .../instrumented-app/index.js | 16 - .../instrumented-app/package.json | 15 - Chapter01/enabling-debug-logs/app/index.js | 13 - .../enabling-debug-logs/app/package.json | 16 - .../instrumented-app/index.js | 15 - .../instrumented-app/package.json | 17 - .../enabling-debug-logs/logging-app/index.js | 13 - .../logging-app/package.json | 19 - .../logging-app/package.json.save | 18 - .../enhancing-stack-traces/app/content.js | 5 - Chapter01/enhancing-stack-traces/app/index.js | 7 - .../enhancing-stack-traces/app/package.json | 15 - .../enhancing-stack-traces/app/routes.js | 9 - .../async-stack-app/content.js | 9 - .../async-stack-app/index.js | 10 - .../async-stack-app/package.json | 18 - .../async-stack-app/routes.js | 15 - .../infinite-stack-in-dev-app/content.js | 5 - .../infinite-stack-in-dev-app/index.js | 10 - .../infinite-stack-in-dev-app/package.json | 15 - .../infinite-stack-in-dev-app/routes.js | 9 - .../pretty-stack-app/content.js | 5 - .../pretty-stack-app/index.js | 8 - .../pretty-stack-app/package.json | 17 - .../pretty-stack-app/routes.js | 9 - .../communicating-over-sockets/client.js | 16 - .../net-sockets-are-streams/client.js | 14 - .../net-sockets-are-streams/echo-client.js | 3 - .../net-sockets-are-streams/echo-server.js | 3 - .../net-sockets-are-streams/server.js | 13 - .../communicating-over-sockets/server.js | 13 - .../udp-sockets/client.js | 13 - .../udp-sockets/server.js | 10 - .../unix-sockets/client.js | 16 - .../unix-sockets/server.js | 13 - .../checking-file-existence/check.js | 17 - .../getting-symlink-information/meta.js | 66 --- .../my-folder/absolute-symlink | 1 - .../my-folder/link-to-symlink | 1 - .../my-folder/my-file | 1 - .../my-folder/my-private-file | 0 .../my-folder/my-subdir/another-file | 0 .../my-folder/my-subdir/my-subsubdir/too-deep | 0 .../my-folder/my-subdir/subdir-symlink | 1 - .../my-folder/my-symlink | 1 - .../my-folder/relative-symlink | 1 - .../my-folder/too-deep | 1 - .../make-file-efficiently.js | 26 - .../manipulating-meta-data/make-file.js | 25 - Chapter03/fetching-meta-data/meta.js | 51 -- .../fetching-meta-data/my-folder/my-file | 1 - .../my-folder/my-private-file | 0 .../my-folder/my-subdir/another-file | 0 .../my-folder/my-subdir/my-subsubdir/too-deep | 0 .../fetching-meta-data/my-folder/my-symlink | 1 - Chapter03/fetching-meta-data/package.json | 14 - .../interfacing-with-standard-io/base64.js | 6 - .../piping/base64.js | 4 - .../piping/package.json | 16 - .../my-file.txt | 1 - .../package.json | 15 - .../watching-files-and-directories/watcher.js | 44 -- .../watching-with-chokidar/package.json | 16 - .../watching-with-chokidar/watcher.js | 28 - .../asynchronous-file-operations/clean.dat | 140 ----- .../asynchronous-file-operations/file.dat | Bin 1090435 -> 0 bytes .../asynchronous-file-operations/log.txt | 22 - ...ll-byte-remover-sync-with-progress-dots.js | 16 - .../null-byte-remover.js | 19 - Chapter03/working-with-files/clean.dat | 189 ------ Chapter03/working-with-files/file.dat | Bin 1079967 -> 0 bytes .../incremental-processing/clean.dat | 122 ---- .../incremental-processing/file.dat | Bin 1079453 -> 0 bytes .../incremental-processing/log.txt | 4 - .../null-byte-remover.js | 23 - .../incremental-processing/package.json | 14 - Chapter03/working-with-files/log.txt | 6 - .../working-with-files/null-byte-remover.js | 15 - .../app/index-fixed.js | 21 - .../anticipating-malicious-input/app/index.js | 17 - .../app/package.json | 15 - .../buffer-safety/index-fixed.js | 87 --- .../buffer-safety/index.js | 80 --- .../json-validation/index-fixed.js | 78 --- .../json-validation/index.js | 53 -- .../json-validation/package.json | 15 - .../app/.snyk | 4 - .../app/package.json | 19 - Chapter08/guarding-against-xss/app/index.js | 32 - .../guarding-against-xss/app/package.json | 15 - .../guarding-against-xss/fixed-app/index.js | 34 -- .../fixed-app/package.json | 16 - .../fully-escaped-app/index.js | 33 -- .../fully-escaped-app/package.json | 17 - .../param-constraints-app/index.js | 46 -- .../param-constraints-app/package.json | 16 - .../protocol-safe-app/index.js | 33 -- .../protocol-safe-app/package.json | 16 - .../app/index.js | 80 --- .../app/package.json | 18 - .../attacker/index.js | 19 - .../fixed-app/index.js | 83 --- .../fixed-app/package.json | 18 - .../secured-app/index.js | 86 --- .../secured-app/package.json | 19 - Chapter08/web-server-hardening/app/app.js | 47 -- Chapter08/web-server-hardening/app/bin/www | 90 --- .../web-server-hardening/app/package.json | 18 - .../app/public/stylesheets/style.css | 8 - .../web-server-hardening/app/routes/index.js | 9 - .../web-server-hardening/app/routes/users.js | 9 - .../web-server-hardening/app/views/error.jade | 6 - .../web-server-hardening/app/views/index.jade | 5 - .../app/views/layout.jade | 7 - .../web-server-hardening/hapi-app/.gitignore | 1 - .../web-server-hardening/hapi-app/LICENSE | 21 - .../web-server-hardening/hapi-app/README.md | 21 - .../hapi-app/config/default.json | 12 - .../hapi-app/lib/index.js | 34 -- .../web-server-hardening/hapi-app/lib/init.js | 39 -- .../web-server-hardening/hapi-app/lib/logs.js | 21 - .../hapi-app/lib/server/index.js | 19 - .../hapi-app/lib/server/package.json | 4 - .../hapi-app/lib/server/routes.js | 22 - .../hapi-app/lib/views/hello.html | 1 - .../hapi-app/lib/views/index.html | 1 - .../hapi-app/package.json | 24 - .../web-server-hardening/hapi-app/yarn.lock | 551 ------------------ .../web-server-hardening/http-app/index.js | 25 - Chapter08/web-server-hardening/koa-app/app.js | 61 -- .../web-server-hardening/koa-app/bin/www | 106 ---- .../web-server-hardening/koa-app/gulpfile.js | 66 --- .../web-server-hardening/koa-app/log4js.json | 38 -- .../web-server-hardening/koa-app/package.json | 31 - .../koa-app/public/stylesheets/style.css | 8 - .../koa-app/routes/index.js | 19 - .../koa-app/routes/users.js | 7 - .../koa-app/views/error.jade | 6 - .../koa-app/views/index.jade | 5 - .../koa-app/views/layout.jade | 7 - Chapter09/async-opt/calculate-average.js | 23 - Chapter09/async-opt/load.js | 26 - Chapter09/async-opt/package.json | 17 - Chapter09/async-opt/server-average.js | 19 - Chapter09/async-opt/server-cache.js | 56 -- Chapter09/async-opt/server-no-reduce.js | 29 - Chapter09/async-opt/server-one-sum-fn.js | 33 -- Chapter09/async-opt/server.js | 26 - Chapter09/async-opt/server2.js | 27 - .../measuring-post-performance/package.json | 15 - .../measuring-post-performance/server.js | 14 - Chapter09/bench-http/package.json | 14 - .../profiling-for-production/package.json | 15 - .../profiling-for-production/server.js | 14 - .../profiling-for-production/views/hello.jade | 7 - Chapter09/bench-http/server.js | 10 - Chapter09/hello-server/package.json | 16 - Chapter09/hello-server/server.js | 12 - Chapter09/hello-server/views/hello.jade | 7 - Chapter09/name-server/climem-enabled/index.js | 16 - .../name-server/climem-enabled/package.json | 18 - Chapter09/name-server/index.js | 16 - Chapter09/name-server/non-leaky/index.js | 15 - Chapter09/name-server/non-leaky/package.json | 15 - Chapter09/name-server/package.json | 15 - Chapter09/placeholder.deleteme | 0 Chapter09/sync-opt/bench.js | 33 -- .../checking-optimization-status/bench.js | 42 -- .../func-status.js | 15 - .../no-collections-vs-no-try-catch.js | 28 - .../no-collections.js | 15 - .../no-try-catch-bench.js | 28 - .../no-try-catch.js | 17 - .../checking-optimization-status/slow.js | 16 - Chapter09/sync-opt/function-inlining/bench.js | 38 -- .../function-inlining/initial-bench.js | 29 - .../no-collections-vs-no-try-catch.js | 28 - .../function-inlining/no-collections.js | 15 - .../function-inlining/no-try-catch-bench.js | 28 - .../function-inlining/no-try-catch.js | 17 - Chapter09/sync-opt/function-inlining/slow.js | 16 - Chapter09/sync-opt/initial-bench.js | 28 - Chapter09/sync-opt/no-collections.js | 15 - Chapter09/sync-opt/package.json | 14 - Chapter09/sync-opt/slow.js | 16 - .../micro/adderservice/index.js | 7 - .../micro/adderservice/package.json | 18 - .../micro/adderservice/service.js | 13 - .../micro/adderservice/test/index.js | 13 - .../micro/adderservice/wiring.js | 27 - .../micro/auditservice/index.js | 6 - .../micro/auditservice/package.json | 17 - .../micro/auditservice/service.js | 74 --- .../micro/auditservice/wiring.js | 39 -- .../micro/eventservice/index.js | 5 - .../micro/eventservice/package.json | 18 - .../micro/eventservice/service.js | 80 --- .../micro/eventservice/wiring.js | 53 -- .../micro/fuge/fuge.yml | 45 -- .../micro/report/env.js | 17 - .../micro/report/index.js | 43 -- .../micro/report/package.json | 17 - .../micro/webapp/app.js | 52 -- .../micro/webapp/bin/www | 90 --- .../micro/webapp/lib/event-logger.js | 40 -- .../micro/webapp/package.json | 20 - .../micro/webapp/public/stylesheets/style.css | 8 - .../micro/webapp/routes/add.js | 68 --- .../micro/webapp/routes/audit.js | 37 -- .../micro/webapp/routes/index.js | 9 - .../micro/webapp/routes/users.js | 9 - .../micro/webapp/views/add.ejs | 16 - .../micro/webapp/views/audit.ejs | 15 - .../micro/webapp/views/error.ejs | 3 - .../micro/webapp/views/index.ejs | 11 - .../micro/adderservice/package.json | 15 - .../micro/adderservice/service.js | 18 - .../micro/inttest/addtest.js | 18 - .../micro/inttest/package.json | 16 - .../consuming-a-service/micro/webapp/app.js | 48 -- .../consuming-a-service/micro/webapp/bin/www | 90 --- .../micro/webapp/package.json | 18 - .../micro/webapp/public/stylesheets/style.css | 8 - .../micro/webapp/routes/add.js | 26 - .../micro/webapp/routes/index.js | 9 - .../micro/webapp/routes/users.js | 9 - .../micro/webapp/views/add.ejs | 16 - .../micro/webapp/views/error.ejs | 3 - .../micro/webapp/views/index.ejs | 11 - .../micro-core-http/adderservice/package.json | 15 - .../micro-core-http/adderservice/service.js | 30 - .../micro-core-http/curlexample.sh | 1 - .../micro/adderservice/package.json | 15 - .../micro/adderservice/service.js | 18 - .../micro/curlexample.sh | 1 - .../micro/adderservice/index.js | 7 - .../micro/adderservice/package.json | 18 - .../micro/adderservice/service.js | 13 - .../micro/adderservice/test/index.js | 13 - .../micro/adderservice/wiring.js | 27 - .../micro/auditservice/index.js | 6 - .../micro/auditservice/package.json | 17 - .../micro/auditservice/service.js | 74 --- .../micro/auditservice/wiring.js | 39 -- .../micro/fuge/fuge.yml | 35 -- .../micro/webapp/app.js | 50 -- .../micro/webapp/bin/www | 90 --- .../micro/webapp/package.json | 20 - .../micro/webapp/public/stylesheets/style.css | 8 - .../micro/webapp/routes/add.js | 68 --- .../micro/webapp/routes/audit.js | 37 -- .../micro/webapp/routes/index.js | 9 - .../micro/webapp/routes/users.js | 9 - .../micro/webapp/views/add.ejs | 16 - .../micro/webapp/views/audit.ejs | 15 - .../micro/webapp/views/error.ejs | 3 - .../micro/webapp/views/index.ejs | 11 - .../micro-lil-pids/adderservice/package.json | 15 - .../micro-lil-pids/adderservice/service.js | 19 - .../micro-lil-pids/services | 2 - .../micro-lil-pids/webapp/app.js | 48 -- .../micro-lil-pids/webapp/bin/www | 90 --- .../micro-lil-pids/webapp/package.json | 18 - .../webapp/public/stylesheets/style.css | 8 - .../micro-lil-pids/webapp/routes/add.js | 26 - .../micro-lil-pids/webapp/routes/index.js | 9 - .../micro-lil-pids/webapp/routes/users.js | 9 - .../micro-lil-pids/webapp/views/add.ejs | 16 - .../micro-lil-pids/webapp/views/error.ejs | 3 - .../micro-lil-pids/webapp/views/index.ejs | 11 - .../micro/adderservice/package.json | 15 - .../micro/adderservice/service.js | 19 - .../micro/fuge/fuge.yml | 19 - .../micro/fuge/fuge2.yml | 19 - .../micro/webapp/app.js | 48 -- .../micro/webapp/bin/www | 90 --- .../micro/webapp/package.json | 18 - .../micro/webapp/public/stylesheets/style.css | 8 - .../micro/webapp/routes/add.js | 26 - .../micro/webapp/routes/index.js | 9 - .../micro/webapp/routes/users.js | 9 - .../micro/webapp/views/add.ejs | 16 - .../micro/webapp/views/error.ejs | 3 - .../micro/webapp/views/index.ejs | 11 - .../adderservice/index.js | 7 - .../adderservice/package.json | 21 - .../adderservice/service.js | 13 - .../adderservice/test/test.js | 12 - .../adderservice/wiring.js | 55 -- .../micro-pattern-routing/fuge/fuge.yml | 19 - .../micro-pattern-routing/webapp/app.js | 48 -- .../micro-pattern-routing/webapp/bin/www | 90 --- .../micro-pattern-routing/webapp/package.json | 20 - .../webapp/public/stylesheets/style.css | 8 - .../webapp/routes/add.js | 38 -- .../webapp/routes/index.js | 9 - .../webapp/routes/users.js | 9 - .../webapp/views/add.ejs | 16 - .../webapp/views/error.ejs | 3 - .../webapp/views/index.ejs | 11 - .../micro/adderservice/index.js | 7 - .../micro/adderservice/package.json | 18 - .../micro/adderservice/service.js | 13 - .../micro/adderservice/test/index.js | 13 - .../micro/adderservice/wiring.js | 27 - .../micro/fuge/fuge.yml | 19 - .../micro/webapp/app.js | 48 -- .../micro/webapp/bin/www | 90 --- .../micro/webapp/package.json | 19 - .../micro/webapp/public/stylesheets/style.css | 8 - .../micro/webapp/routes/add.js | 34 -- .../micro/webapp/routes/index.js | 9 - .../micro/webapp/routes/users.js | 9 - .../micro/webapp/views/add.ejs | 16 - .../micro/webapp/views/error.ejs | 3 - .../micro/webapp/views/index.ejs | 11 - .../micro/adderservice/index.js | 7 - .../micro/adderservice/package.json | 18 - .../micro/adderservice/service.js | 13 - .../micro/adderservice/test/index.js | 13 - .../micro/adderservice/wiring.js | 27 - .../micro/auditservice/index.js | 6 - .../micro/auditservice/package.json | 16 - .../micro/auditservice/service.js | 58 -- .../micro/auditservice/wiring.js | 39 -- .../micro/fuge/fuge.yml | 30 - .../micro/fuge/fuge2.yml | 31 - .../micro/webapp/app.js | 50 -- .../micro/webapp/bin/www | 90 --- .../micro/webapp/package.json | 19 - .../micro/webapp/public/stylesheets/style.css | 8 - .../micro/webapp/routes/add.js | 49 -- .../micro/webapp/routes/audit.js | 25 - .../micro/webapp/routes/index.js | 9 - .../micro/webapp/routes/users.js | 9 - .../micro/webapp/views/add.ejs | 16 - .../micro/webapp/views/audit.ejs | 15 - .../micro/webapp/views/error.ejs | 3 - .../micro/webapp/views/index.ejs | 11 - .../micro/adderservice/.dockerignore | 4 - .../micro/adderservice/Dockerfile | 7 - .../micro/adderservice/index.js | 6 - .../micro/adderservice/package.json | 15 - .../micro/adderservice/service.js | 13 - .../micro/adderservice/wiring.js | 26 - Chapter11/building-a-single-container/test.sh | 1 - .../micro/adderservice/.dockerignore | 4 - .../micro/adderservice/Dockerfile | 7 - .../micro/adderservice/Jenkinsfile | 32 - .../micro/adderservice/build.sh | 23 - .../micro/adderservice/index.js | 7 - .../micro/adderservice/package.json | 18 - .../micro/adderservice/service.js | 13 - .../micro/adderservice/wiring.js | 27 - .../micro/deployment/deployment-template.yml | 17 - .../micro/deployment/namespace.yml | 6 - .../micro/deployment/service-template.yml | 16 - .../micro/adderservice/.dockerignore | 4 - .../micro/adderservice/Dockerfile | 7 - .../micro/adderservice/index.js | 6 - .../micro/adderservice/package.json | 15 - .../micro/adderservice/service.js | 13 - .../micro/adderservice/wiring.js | 26 - .../micro/deployment/adderservice-dep.yml | 16 - .../micro/deployment/adderservice-svc.yml | 15 - .../micro/deployment/namespace.yml | 6 - .../micro2/adderservice/.dockerignore | 4 - .../micro2/adderservice/Dockerfile | 7 - .../micro2/adderservice/index.js | 6 - .../micro2/adderservice/package.json | 15 - .../micro2/adderservice/service.js | 14 - .../micro2/adderservice/wiring.js | 26 - .../micro2/deployment/adderservice-dep.yml | 16 - .../micro2/deployment/adderservice-svc.yml | 15 - .../micro2/deployment/namespace.yml | 6 - .../test.sh | 1 - .../micro/adderservice/.dockerignore | 4 - .../micro/adderservice/Dockerfile | 7 - .../micro/adderservice/Jenkinsfile | 32 - .../micro/adderservice/build.sh | 23 - .../micro/adderservice/index.js | 7 - .../micro/adderservice/package.json | 15 - .../micro/adderservice/service.js | 13 - .../micro/adderservice/wiring.js | 27 - .../micro/auditservice/.dockerignore | 4 - .../micro/auditservice/Dockerfile | 7 - .../micro/auditservice/Jenkinsfile | 32 - .../micro/auditservice/build.sh | 23 - .../micro/auditservice/index.js | 6 - .../micro/auditservice/package.json | 17 - .../micro/auditservice/service.js | 74 --- .../micro/auditservice/wiring.js | 39 -- .../micro/deployment/deployment-template.yml | 17 - .../micro/deployment/namespace.yml | 6 - .../micro/deployment/service-template.yml | 16 - .../micro/eventservice/.dockerignore | 4 - .../micro/eventservice/Dockerfile | 7 - .../micro/eventservice/Jenkinsfile | 32 - .../micro/eventservice/build.sh | 23 - .../micro/eventservice/index.js | 5 - .../micro/eventservice/package.json | 17 - .../micro/eventservice/service.js | 80 --- .../micro/eventservice/wiring.js | 53 -- .../micro/fuge/fuge.yml | 45 -- .../micro/infrastructure/Jenkinsfile | 22 - .../micro/infrastructure/build.sh | 22 - .../micro/report/.dockerignore | 4 - .../micro/report/Dockerfile | 7 - .../micro/report/env.js | 17 - .../micro/report/index.js | 43 -- .../micro/report/package.json | 17 - .../micro/webapp/.dockerignore | 4 - .../micro/webapp/Dockerfile | 7 - .../micro/webapp/app.js | 52 -- .../micro/webapp/bin/www | 90 --- .../micro/webapp/lib/event-logger.js | 40 -- .../micro/webapp/package.json | 20 - .../micro/webapp/public/stylesheets/style.css | 8 - .../micro/webapp/routes/add.js | 68 --- .../micro/webapp/routes/audit.js | 37 -- .../micro/webapp/routes/index.js | 9 - .../micro/webapp/routes/users.js | 9 - .../micro/webapp/views/add.ejs | 16 - .../micro/webapp/views/audit.ejs | 15 - .../micro/webapp/views/error.ejs | 3 - .../micro/webapp/views/index.ejs | 11 - .../micro/adderservice/.dockerignore | 4 - .../micro/adderservice/Dockerfile | 7 - .../micro/adderservice/Jenkinsfile | 32 - .../micro/adderservice/build.sh | 23 - .../micro/adderservice/index.js | 7 - .../micro/adderservice/package.json | 15 - .../micro/adderservice/service.js | 13 - .../micro/adderservice/wiring.js | 27 - .../micro/auditservice/.dockerignore | 4 - .../micro/auditservice/Dockerfile | 7 - .../micro/auditservice/Jenkinsfile | 32 - .../micro/auditservice/build.sh | 23 - .../micro/auditservice/index.js | 6 - .../micro/auditservice/package.json | 17 - .../micro/auditservice/service.js | 74 --- .../micro/auditservice/wiring.js | 39 -- .../micro/deployment/deployment-template.yml | 17 - .../micro/deployment/namespace.yml | 6 - .../micro/deployment/service-template-lb.yml | 16 - .../micro/deployment/service-template.yml | 16 - .../micro/eventservice/.dockerignore | 4 - .../micro/eventservice/Dockerfile | 7 - .../micro/eventservice/Jenkinsfile | 32 - .../micro/eventservice/build.sh | 23 - .../micro/eventservice/index.js | 5 - .../micro/eventservice/package.json | 17 - .../micro/eventservice/service.js | 80 --- .../micro/eventservice/wiring.js | 53 -- .../micro/fuge/fuge.yml | 45 -- .../micro/infrastructure/Jenkinsfile | 22 - .../micro/infrastructure/build.sh | 22 - .../micro/report/.dockerignore | 4 - .../micro/report/Dockerfile | 7 - .../micro/report/env.js | 17 - .../micro/report/index.js | 43 -- .../micro/report/package.json | 17 - .../micro/webapp/.dockerignore | 4 - .../micro/webapp/Dockerfile | 7 - .../micro/webapp/app.js | 52 -- .../micro/webapp/bin/www | 90 --- .../micro/webapp/lib/event-logger.js | 40 -- .../micro/webapp/package.json | 20 - .../micro/webapp/public/stylesheets/style.css | 8 - .../micro/webapp/routes/add.js | 68 --- .../micro/webapp/routes/audit.js | 37 -- .../micro/webapp/routes/index.js | 9 - .../micro/webapp/routes/users.js | 9 - .../micro/webapp/views/add.ejs | 16 - .../micro/webapp/views/audit.ejs | 15 - .../micro/webapp/views/error.ejs | 3 - .../micro/webapp/views/index.ejs | 11 - .../micro/adderservice/.dockerignore | 4 - .../micro/adderservice/Dockerfile | 7 - .../micro/adderservice/index.js | 6 - .../micro/adderservice/package.json | 15 - .../micro/adderservice/service.js | 13 - .../micro/adderservice/wiring.js | 26 - .../micro/certs/localhost.crt | 34 -- .../micro/certs/localhost.key | 51 -- .../micro/adderservice/.dockerignore | 4 - .../micro/adderservice/Dockerfile | 7 - .../micro/adderservice/index.js | 6 - .../micro/adderservice/package.json | 15 - .../micro/adderservice/service.js | 13 - .../micro/adderservice/wiring.js | 26 - Chapter11/storing-images-on-dockerhub/test.sh | 1 - 498 files changed, 11344 deletions(-) delete mode 100644 Chapter01/debugging-with-devtools/app/future.js delete mode 100644 Chapter01/debugging-with-devtools/app/index.js delete mode 100644 Chapter01/debugging-with-devtools/app/package.json delete mode 100644 Chapter01/debugging-with-devtools/app/past.js delete mode 100644 Chapter01/enabling-core-debug-logs/app/index.js delete mode 100644 Chapter01/enabling-core-debug-logs/app/package.json delete mode 100644 Chapter01/enabling-core-debug-logs/instrumented-app/index.js delete mode 100644 Chapter01/enabling-core-debug-logs/instrumented-app/package.json delete mode 100644 Chapter01/enabling-debug-logs/app/index.js delete mode 100644 Chapter01/enabling-debug-logs/app/package.json delete mode 100644 Chapter01/enabling-debug-logs/instrumented-app/index.js delete mode 100644 Chapter01/enabling-debug-logs/instrumented-app/package.json delete mode 100644 Chapter01/enabling-debug-logs/logging-app/index.js delete mode 100644 Chapter01/enabling-debug-logs/logging-app/package.json delete mode 100644 Chapter01/enabling-debug-logs/logging-app/package.json.save delete mode 100644 Chapter01/enhancing-stack-traces/app/content.js delete mode 100644 Chapter01/enhancing-stack-traces/app/index.js delete mode 100644 Chapter01/enhancing-stack-traces/app/package.json delete mode 100644 Chapter01/enhancing-stack-traces/app/routes.js delete mode 100644 Chapter01/enhancing-stack-traces/async-stack-app/content.js delete mode 100644 Chapter01/enhancing-stack-traces/async-stack-app/index.js delete mode 100644 Chapter01/enhancing-stack-traces/async-stack-app/package.json delete mode 100644 Chapter01/enhancing-stack-traces/async-stack-app/routes.js delete mode 100644 Chapter01/enhancing-stack-traces/infinite-stack-in-dev-app/content.js delete mode 100644 Chapter01/enhancing-stack-traces/infinite-stack-in-dev-app/index.js delete mode 100644 Chapter01/enhancing-stack-traces/infinite-stack-in-dev-app/package.json delete mode 100644 Chapter01/enhancing-stack-traces/infinite-stack-in-dev-app/routes.js delete mode 100644 Chapter01/enhancing-stack-traces/pretty-stack-app/content.js delete mode 100644 Chapter01/enhancing-stack-traces/pretty-stack-app/index.js delete mode 100644 Chapter01/enhancing-stack-traces/pretty-stack-app/package.json delete mode 100644 Chapter01/enhancing-stack-traces/pretty-stack-app/routes.js delete mode 100644 Chapter03/communicating-over-sockets/client.js delete mode 100644 Chapter03/communicating-over-sockets/net-sockets-are-streams/client.js delete mode 100644 Chapter03/communicating-over-sockets/net-sockets-are-streams/echo-client.js delete mode 100644 Chapter03/communicating-over-sockets/net-sockets-are-streams/echo-server.js delete mode 100644 Chapter03/communicating-over-sockets/net-sockets-are-streams/server.js delete mode 100644 Chapter03/communicating-over-sockets/server.js delete mode 100644 Chapter03/communicating-over-sockets/udp-sockets/client.js delete mode 100644 Chapter03/communicating-over-sockets/udp-sockets/server.js delete mode 100644 Chapter03/communicating-over-sockets/unix-sockets/client.js delete mode 100644 Chapter03/communicating-over-sockets/unix-sockets/server.js delete mode 100644 Chapter03/fetching-meta-data/checking-file-existence/check.js delete mode 100644 Chapter03/fetching-meta-data/getting-symlink-information/meta.js delete mode 100644 Chapter03/fetching-meta-data/getting-symlink-information/my-folder/absolute-symlink delete mode 100644 Chapter03/fetching-meta-data/getting-symlink-information/my-folder/link-to-symlink delete mode 100644 Chapter03/fetching-meta-data/getting-symlink-information/my-folder/my-file delete mode 100644 Chapter03/fetching-meta-data/getting-symlink-information/my-folder/my-private-file delete mode 100644 Chapter03/fetching-meta-data/getting-symlink-information/my-folder/my-subdir/another-file delete mode 100644 Chapter03/fetching-meta-data/getting-symlink-information/my-folder/my-subdir/my-subsubdir/too-deep delete mode 100644 Chapter03/fetching-meta-data/getting-symlink-information/my-folder/my-subdir/subdir-symlink delete mode 100644 Chapter03/fetching-meta-data/getting-symlink-information/my-folder/my-symlink delete mode 100644 Chapter03/fetching-meta-data/getting-symlink-information/my-folder/relative-symlink delete mode 100644 Chapter03/fetching-meta-data/getting-symlink-information/my-folder/too-deep delete mode 100644 Chapter03/fetching-meta-data/manipulating-meta-data/make-file-efficiently.js delete mode 100644 Chapter03/fetching-meta-data/manipulating-meta-data/make-file.js delete mode 100644 Chapter03/fetching-meta-data/meta.js delete mode 100644 Chapter03/fetching-meta-data/my-folder/my-file delete mode 100644 Chapter03/fetching-meta-data/my-folder/my-private-file delete mode 100644 Chapter03/fetching-meta-data/my-folder/my-subdir/another-file delete mode 100644 Chapter03/fetching-meta-data/my-folder/my-subdir/my-subsubdir/too-deep delete mode 100644 Chapter03/fetching-meta-data/my-folder/my-symlink delete mode 100644 Chapter03/fetching-meta-data/package.json delete mode 100644 Chapter03/interfacing-with-standard-io/base64.js delete mode 100644 Chapter03/interfacing-with-standard-io/piping/base64.js delete mode 100644 Chapter03/interfacing-with-standard-io/piping/package.json delete mode 100644 Chapter03/watching-files-and-directories/my-file.txt delete mode 100644 Chapter03/watching-files-and-directories/package.json delete mode 100644 Chapter03/watching-files-and-directories/watcher.js delete mode 100644 Chapter03/watching-files-and-directories/watching-with-chokidar/package.json delete mode 100644 Chapter03/watching-files-and-directories/watching-with-chokidar/watcher.js delete mode 100644 Chapter03/working-with-files/asynchronous-file-operations/clean.dat delete mode 100644 Chapter03/working-with-files/asynchronous-file-operations/file.dat delete mode 100644 Chapter03/working-with-files/asynchronous-file-operations/log.txt delete mode 100644 Chapter03/working-with-files/asynchronous-file-operations/null-byte-remover-sync-with-progress-dots.js delete mode 100644 Chapter03/working-with-files/asynchronous-file-operations/null-byte-remover.js delete mode 100644 Chapter03/working-with-files/clean.dat delete mode 100644 Chapter03/working-with-files/file.dat delete mode 100644 Chapter03/working-with-files/incremental-processing/clean.dat delete mode 100644 Chapter03/working-with-files/incremental-processing/file.dat delete mode 100644 Chapter03/working-with-files/incremental-processing/log.txt delete mode 100644 Chapter03/working-with-files/incremental-processing/null-byte-remover.js delete mode 100644 Chapter03/working-with-files/incremental-processing/package.json delete mode 100644 Chapter03/working-with-files/log.txt delete mode 100644 Chapter03/working-with-files/null-byte-remover.js delete mode 100644 Chapter08/anticipating-malicious-input/app/index-fixed.js delete mode 100644 Chapter08/anticipating-malicious-input/app/index.js delete mode 100644 Chapter08/anticipating-malicious-input/app/package.json delete mode 100644 Chapter08/anticipating-malicious-input/buffer-safety/index-fixed.js delete mode 100644 Chapter08/anticipating-malicious-input/buffer-safety/index.js delete mode 100644 Chapter08/anticipating-malicious-input/json-validation/index-fixed.js delete mode 100644 Chapter08/anticipating-malicious-input/json-validation/index.js delete mode 100644 Chapter08/anticipating-malicious-input/json-validation/package.json delete mode 100644 Chapter08/detecting-dependency-vulnerabilities/app/.snyk delete mode 100644 Chapter08/detecting-dependency-vulnerabilities/app/package.json delete mode 100644 Chapter08/guarding-against-xss/app/index.js delete mode 100644 Chapter08/guarding-against-xss/app/package.json delete mode 100644 Chapter08/guarding-against-xss/fixed-app/index.js delete mode 100644 Chapter08/guarding-against-xss/fixed-app/package.json delete mode 100644 Chapter08/guarding-against-xss/fully-escaped-app/index.js delete mode 100644 Chapter08/guarding-against-xss/fully-escaped-app/package.json delete mode 100644 Chapter08/guarding-against-xss/param-constraints-app/index.js delete mode 100644 Chapter08/guarding-against-xss/param-constraints-app/package.json delete mode 100644 Chapter08/guarding-against-xss/protocol-safe-app/index.js delete mode 100644 Chapter08/guarding-against-xss/protocol-safe-app/package.json delete mode 100644 Chapter08/preventing-cross-site-request-forgery/app/index.js delete mode 100644 Chapter08/preventing-cross-site-request-forgery/app/package.json delete mode 100644 Chapter08/preventing-cross-site-request-forgery/attacker/index.js delete mode 100644 Chapter08/preventing-cross-site-request-forgery/fixed-app/index.js delete mode 100644 Chapter08/preventing-cross-site-request-forgery/fixed-app/package.json delete mode 100644 Chapter08/preventing-cross-site-request-forgery/secured-app/index.js delete mode 100644 Chapter08/preventing-cross-site-request-forgery/secured-app/package.json delete mode 100644 Chapter08/web-server-hardening/app/app.js delete mode 100644 Chapter08/web-server-hardening/app/bin/www delete mode 100644 Chapter08/web-server-hardening/app/package.json delete mode 100644 Chapter08/web-server-hardening/app/public/stylesheets/style.css delete mode 100644 Chapter08/web-server-hardening/app/routes/index.js delete mode 100644 Chapter08/web-server-hardening/app/routes/users.js delete mode 100644 Chapter08/web-server-hardening/app/views/error.jade delete mode 100644 Chapter08/web-server-hardening/app/views/index.jade delete mode 100644 Chapter08/web-server-hardening/app/views/layout.jade delete mode 100644 Chapter08/web-server-hardening/hapi-app/.gitignore delete mode 100644 Chapter08/web-server-hardening/hapi-app/LICENSE delete mode 100644 Chapter08/web-server-hardening/hapi-app/README.md delete mode 100644 Chapter08/web-server-hardening/hapi-app/config/default.json delete mode 100644 Chapter08/web-server-hardening/hapi-app/lib/index.js delete mode 100644 Chapter08/web-server-hardening/hapi-app/lib/init.js delete mode 100644 Chapter08/web-server-hardening/hapi-app/lib/logs.js delete mode 100644 Chapter08/web-server-hardening/hapi-app/lib/server/index.js delete mode 100644 Chapter08/web-server-hardening/hapi-app/lib/server/package.json delete mode 100644 Chapter08/web-server-hardening/hapi-app/lib/server/routes.js delete mode 100644 Chapter08/web-server-hardening/hapi-app/lib/views/hello.html delete mode 100644 Chapter08/web-server-hardening/hapi-app/lib/views/index.html delete mode 100644 Chapter08/web-server-hardening/hapi-app/package.json delete mode 100644 Chapter08/web-server-hardening/hapi-app/yarn.lock delete mode 100644 Chapter08/web-server-hardening/http-app/index.js delete mode 100644 Chapter08/web-server-hardening/koa-app/app.js delete mode 100644 Chapter08/web-server-hardening/koa-app/bin/www delete mode 100644 Chapter08/web-server-hardening/koa-app/gulpfile.js delete mode 100644 Chapter08/web-server-hardening/koa-app/log4js.json delete mode 100644 Chapter08/web-server-hardening/koa-app/package.json delete mode 100644 Chapter08/web-server-hardening/koa-app/public/stylesheets/style.css delete mode 100644 Chapter08/web-server-hardening/koa-app/routes/index.js delete mode 100644 Chapter08/web-server-hardening/koa-app/routes/users.js delete mode 100644 Chapter08/web-server-hardening/koa-app/views/error.jade delete mode 100644 Chapter08/web-server-hardening/koa-app/views/index.jade delete mode 100644 Chapter08/web-server-hardening/koa-app/views/layout.jade delete mode 100644 Chapter09/async-opt/calculate-average.js delete mode 100644 Chapter09/async-opt/load.js delete mode 100644 Chapter09/async-opt/package.json delete mode 100644 Chapter09/async-opt/server-average.js delete mode 100644 Chapter09/async-opt/server-cache.js delete mode 100644 Chapter09/async-opt/server-no-reduce.js delete mode 100644 Chapter09/async-opt/server-one-sum-fn.js delete mode 100644 Chapter09/async-opt/server.js delete mode 100644 Chapter09/async-opt/server2.js delete mode 100644 Chapter09/bench-http/measuring-post-performance/package.json delete mode 100644 Chapter09/bench-http/measuring-post-performance/server.js delete mode 100644 Chapter09/bench-http/package.json delete mode 100644 Chapter09/bench-http/profiling-for-production/package.json delete mode 100644 Chapter09/bench-http/profiling-for-production/server.js delete mode 100644 Chapter09/bench-http/profiling-for-production/views/hello.jade delete mode 100644 Chapter09/bench-http/server.js delete mode 100644 Chapter09/hello-server/package.json delete mode 100644 Chapter09/hello-server/server.js delete mode 100644 Chapter09/hello-server/views/hello.jade delete mode 100644 Chapter09/name-server/climem-enabled/index.js delete mode 100644 Chapter09/name-server/climem-enabled/package.json delete mode 100644 Chapter09/name-server/index.js delete mode 100644 Chapter09/name-server/non-leaky/index.js delete mode 100644 Chapter09/name-server/non-leaky/package.json delete mode 100644 Chapter09/name-server/package.json delete mode 100644 Chapter09/placeholder.deleteme delete mode 100644 Chapter09/sync-opt/bench.js delete mode 100644 Chapter09/sync-opt/checking-optimization-status/bench.js delete mode 100644 Chapter09/sync-opt/checking-optimization-status/func-status.js delete mode 100644 Chapter09/sync-opt/checking-optimization-status/no-collections-vs-no-try-catch.js delete mode 100644 Chapter09/sync-opt/checking-optimization-status/no-collections.js delete mode 100644 Chapter09/sync-opt/checking-optimization-status/no-try-catch-bench.js delete mode 100644 Chapter09/sync-opt/checking-optimization-status/no-try-catch.js delete mode 100644 Chapter09/sync-opt/checking-optimization-status/slow.js delete mode 100644 Chapter09/sync-opt/function-inlining/bench.js delete mode 100644 Chapter09/sync-opt/function-inlining/initial-bench.js delete mode 100644 Chapter09/sync-opt/function-inlining/no-collections-vs-no-try-catch.js delete mode 100644 Chapter09/sync-opt/function-inlining/no-collections.js delete mode 100644 Chapter09/sync-opt/function-inlining/no-try-catch-bench.js delete mode 100644 Chapter09/sync-opt/function-inlining/no-try-catch.js delete mode 100644 Chapter09/sync-opt/function-inlining/slow.js delete mode 100644 Chapter09/sync-opt/initial-bench.js delete mode 100644 Chapter09/sync-opt/no-collections.js delete mode 100644 Chapter09/sync-opt/package.json delete mode 100644 Chapter09/sync-opt/slow.js delete mode 100644 Chapter10/adding-a-queue-based-service/micro/adderservice/index.js delete mode 100644 Chapter10/adding-a-queue-based-service/micro/adderservice/package.json delete mode 100644 Chapter10/adding-a-queue-based-service/micro/adderservice/service.js delete mode 100644 Chapter10/adding-a-queue-based-service/micro/adderservice/test/index.js delete mode 100644 Chapter10/adding-a-queue-based-service/micro/adderservice/wiring.js delete mode 100644 Chapter10/adding-a-queue-based-service/micro/auditservice/index.js delete mode 100644 Chapter10/adding-a-queue-based-service/micro/auditservice/package.json delete mode 100644 Chapter10/adding-a-queue-based-service/micro/auditservice/service.js delete mode 100644 Chapter10/adding-a-queue-based-service/micro/auditservice/wiring.js delete mode 100644 Chapter10/adding-a-queue-based-service/micro/eventservice/index.js delete mode 100644 Chapter10/adding-a-queue-based-service/micro/eventservice/package.json delete mode 100644 Chapter10/adding-a-queue-based-service/micro/eventservice/service.js delete mode 100644 Chapter10/adding-a-queue-based-service/micro/eventservice/wiring.js delete mode 100644 Chapter10/adding-a-queue-based-service/micro/fuge/fuge.yml delete mode 100644 Chapter10/adding-a-queue-based-service/micro/report/env.js delete mode 100644 Chapter10/adding-a-queue-based-service/micro/report/index.js delete mode 100644 Chapter10/adding-a-queue-based-service/micro/report/package.json delete mode 100644 Chapter10/adding-a-queue-based-service/micro/webapp/app.js delete mode 100644 Chapter10/adding-a-queue-based-service/micro/webapp/bin/www delete mode 100644 Chapter10/adding-a-queue-based-service/micro/webapp/lib/event-logger.js delete mode 100644 Chapter10/adding-a-queue-based-service/micro/webapp/package.json delete mode 100644 Chapter10/adding-a-queue-based-service/micro/webapp/public/stylesheets/style.css delete mode 100644 Chapter10/adding-a-queue-based-service/micro/webapp/routes/add.js delete mode 100644 Chapter10/adding-a-queue-based-service/micro/webapp/routes/audit.js delete mode 100644 Chapter10/adding-a-queue-based-service/micro/webapp/routes/index.js delete mode 100644 Chapter10/adding-a-queue-based-service/micro/webapp/routes/users.js delete mode 100644 Chapter10/adding-a-queue-based-service/micro/webapp/views/add.ejs delete mode 100644 Chapter10/adding-a-queue-based-service/micro/webapp/views/audit.ejs delete mode 100644 Chapter10/adding-a-queue-based-service/micro/webapp/views/error.ejs delete mode 100644 Chapter10/adding-a-queue-based-service/micro/webapp/views/index.ejs delete mode 100644 Chapter10/consuming-a-service/micro/adderservice/package.json delete mode 100644 Chapter10/consuming-a-service/micro/adderservice/service.js delete mode 100644 Chapter10/consuming-a-service/micro/inttest/addtest.js delete mode 100644 Chapter10/consuming-a-service/micro/inttest/package.json delete mode 100644 Chapter10/consuming-a-service/micro/webapp/app.js delete mode 100644 Chapter10/consuming-a-service/micro/webapp/bin/www delete mode 100644 Chapter10/consuming-a-service/micro/webapp/package.json delete mode 100644 Chapter10/consuming-a-service/micro/webapp/public/stylesheets/style.css delete mode 100644 Chapter10/consuming-a-service/micro/webapp/routes/add.js delete mode 100644 Chapter10/consuming-a-service/micro/webapp/routes/index.js delete mode 100644 Chapter10/consuming-a-service/micro/webapp/routes/users.js delete mode 100644 Chapter10/consuming-a-service/micro/webapp/views/add.ejs delete mode 100644 Chapter10/consuming-a-service/micro/webapp/views/error.ejs delete mode 100644 Chapter10/consuming-a-service/micro/webapp/views/index.ejs delete mode 100644 Chapter10/creating-a-simple-RESTful-microservice/micro-core-http/adderservice/package.json delete mode 100644 Chapter10/creating-a-simple-RESTful-microservice/micro-core-http/adderservice/service.js delete mode 100644 Chapter10/creating-a-simple-RESTful-microservice/micro-core-http/curlexample.sh delete mode 100644 Chapter10/creating-a-simple-RESTful-microservice/micro/adderservice/package.json delete mode 100644 Chapter10/creating-a-simple-RESTful-microservice/micro/adderservice/service.js delete mode 100644 Chapter10/creating-a-simple-RESTful-microservice/micro/curlexample.sh delete mode 100644 Chapter10/service-discovery-with-dns/micro/adderservice/index.js delete mode 100644 Chapter10/service-discovery-with-dns/micro/adderservice/package.json delete mode 100644 Chapter10/service-discovery-with-dns/micro/adderservice/service.js delete mode 100644 Chapter10/service-discovery-with-dns/micro/adderservice/test/index.js delete mode 100644 Chapter10/service-discovery-with-dns/micro/adderservice/wiring.js delete mode 100644 Chapter10/service-discovery-with-dns/micro/auditservice/index.js delete mode 100644 Chapter10/service-discovery-with-dns/micro/auditservice/package.json delete mode 100644 Chapter10/service-discovery-with-dns/micro/auditservice/service.js delete mode 100644 Chapter10/service-discovery-with-dns/micro/auditservice/wiring.js delete mode 100644 Chapter10/service-discovery-with-dns/micro/fuge/fuge.yml delete mode 100644 Chapter10/service-discovery-with-dns/micro/webapp/app.js delete mode 100644 Chapter10/service-discovery-with-dns/micro/webapp/bin/www delete mode 100644 Chapter10/service-discovery-with-dns/micro/webapp/package.json delete mode 100644 Chapter10/service-discovery-with-dns/micro/webapp/public/stylesheets/style.css delete mode 100644 Chapter10/service-discovery-with-dns/micro/webapp/routes/add.js delete mode 100644 Chapter10/service-discovery-with-dns/micro/webapp/routes/audit.js delete mode 100644 Chapter10/service-discovery-with-dns/micro/webapp/routes/index.js delete mode 100644 Chapter10/service-discovery-with-dns/micro/webapp/routes/users.js delete mode 100644 Chapter10/service-discovery-with-dns/micro/webapp/views/add.ejs delete mode 100644 Chapter10/service-discovery-with-dns/micro/webapp/views/audit.ejs delete mode 100644 Chapter10/service-discovery-with-dns/micro/webapp/views/error.ejs delete mode 100644 Chapter10/service-discovery-with-dns/micro/webapp/views/index.ejs delete mode 100644 Chapter10/setting-up-a-development-environment/micro-lil-pids/adderservice/package.json delete mode 100644 Chapter10/setting-up-a-development-environment/micro-lil-pids/adderservice/service.js delete mode 100644 Chapter10/setting-up-a-development-environment/micro-lil-pids/services delete mode 100644 Chapter10/setting-up-a-development-environment/micro-lil-pids/webapp/app.js delete mode 100644 Chapter10/setting-up-a-development-environment/micro-lil-pids/webapp/bin/www delete mode 100644 Chapter10/setting-up-a-development-environment/micro-lil-pids/webapp/package.json delete mode 100644 Chapter10/setting-up-a-development-environment/micro-lil-pids/webapp/public/stylesheets/style.css delete mode 100644 Chapter10/setting-up-a-development-environment/micro-lil-pids/webapp/routes/add.js delete mode 100644 Chapter10/setting-up-a-development-environment/micro-lil-pids/webapp/routes/index.js delete mode 100644 Chapter10/setting-up-a-development-environment/micro-lil-pids/webapp/routes/users.js delete mode 100644 Chapter10/setting-up-a-development-environment/micro-lil-pids/webapp/views/add.ejs delete mode 100644 Chapter10/setting-up-a-development-environment/micro-lil-pids/webapp/views/error.ejs delete mode 100644 Chapter10/setting-up-a-development-environment/micro-lil-pids/webapp/views/index.ejs delete mode 100644 Chapter10/setting-up-a-development-environment/micro/adderservice/package.json delete mode 100644 Chapter10/setting-up-a-development-environment/micro/adderservice/service.js delete mode 100644 Chapter10/setting-up-a-development-environment/micro/fuge/fuge.yml delete mode 100644 Chapter10/setting-up-a-development-environment/micro/fuge/fuge2.yml delete mode 100644 Chapter10/setting-up-a-development-environment/micro/webapp/app.js delete mode 100644 Chapter10/setting-up-a-development-environment/micro/webapp/bin/www delete mode 100644 Chapter10/setting-up-a-development-environment/micro/webapp/package.json delete mode 100644 Chapter10/setting-up-a-development-environment/micro/webapp/public/stylesheets/style.css delete mode 100644 Chapter10/setting-up-a-development-environment/micro/webapp/routes/add.js delete mode 100644 Chapter10/setting-up-a-development-environment/micro/webapp/routes/index.js delete mode 100644 Chapter10/setting-up-a-development-environment/micro/webapp/routes/users.js delete mode 100644 Chapter10/setting-up-a-development-environment/micro/webapp/views/add.ejs delete mode 100644 Chapter10/setting-up-a-development-environment/micro/webapp/views/error.ejs delete mode 100644 Chapter10/setting-up-a-development-environment/micro/webapp/views/index.ejs delete mode 100644 Chapter10/standardizing-service-boilerplate/micro-pattern-routing/adderservice/index.js delete mode 100644 Chapter10/standardizing-service-boilerplate/micro-pattern-routing/adderservice/package.json delete mode 100644 Chapter10/standardizing-service-boilerplate/micro-pattern-routing/adderservice/service.js delete mode 100644 Chapter10/standardizing-service-boilerplate/micro-pattern-routing/adderservice/test/test.js delete mode 100644 Chapter10/standardizing-service-boilerplate/micro-pattern-routing/adderservice/wiring.js delete mode 100644 Chapter10/standardizing-service-boilerplate/micro-pattern-routing/fuge/fuge.yml delete mode 100644 Chapter10/standardizing-service-boilerplate/micro-pattern-routing/webapp/app.js delete mode 100644 Chapter10/standardizing-service-boilerplate/micro-pattern-routing/webapp/bin/www delete mode 100644 Chapter10/standardizing-service-boilerplate/micro-pattern-routing/webapp/package.json delete mode 100644 Chapter10/standardizing-service-boilerplate/micro-pattern-routing/webapp/public/stylesheets/style.css delete mode 100644 Chapter10/standardizing-service-boilerplate/micro-pattern-routing/webapp/routes/add.js delete mode 100644 Chapter10/standardizing-service-boilerplate/micro-pattern-routing/webapp/routes/index.js delete mode 100644 Chapter10/standardizing-service-boilerplate/micro-pattern-routing/webapp/routes/users.js delete mode 100644 Chapter10/standardizing-service-boilerplate/micro-pattern-routing/webapp/views/add.ejs delete mode 100644 Chapter10/standardizing-service-boilerplate/micro-pattern-routing/webapp/views/error.ejs delete mode 100644 Chapter10/standardizing-service-boilerplate/micro-pattern-routing/webapp/views/index.ejs delete mode 100644 Chapter10/standardizing-service-boilerplate/micro/adderservice/index.js delete mode 100644 Chapter10/standardizing-service-boilerplate/micro/adderservice/package.json delete mode 100644 Chapter10/standardizing-service-boilerplate/micro/adderservice/service.js delete mode 100644 Chapter10/standardizing-service-boilerplate/micro/adderservice/test/index.js delete mode 100644 Chapter10/standardizing-service-boilerplate/micro/adderservice/wiring.js delete mode 100644 Chapter10/standardizing-service-boilerplate/micro/fuge/fuge.yml delete mode 100644 Chapter10/standardizing-service-boilerplate/micro/webapp/app.js delete mode 100644 Chapter10/standardizing-service-boilerplate/micro/webapp/bin/www delete mode 100644 Chapter10/standardizing-service-boilerplate/micro/webapp/package.json delete mode 100644 Chapter10/standardizing-service-boilerplate/micro/webapp/public/stylesheets/style.css delete mode 100644 Chapter10/standardizing-service-boilerplate/micro/webapp/routes/add.js delete mode 100644 Chapter10/standardizing-service-boilerplate/micro/webapp/routes/index.js delete mode 100644 Chapter10/standardizing-service-boilerplate/micro/webapp/routes/users.js delete mode 100644 Chapter10/standardizing-service-boilerplate/micro/webapp/views/add.ejs delete mode 100644 Chapter10/standardizing-service-boilerplate/micro/webapp/views/error.ejs delete mode 100644 Chapter10/standardizing-service-boilerplate/micro/webapp/views/index.ejs delete mode 100644 Chapter10/using-containerized-infrastructure/micro/adderservice/index.js delete mode 100644 Chapter10/using-containerized-infrastructure/micro/adderservice/package.json delete mode 100644 Chapter10/using-containerized-infrastructure/micro/adderservice/service.js delete mode 100644 Chapter10/using-containerized-infrastructure/micro/adderservice/test/index.js delete mode 100644 Chapter10/using-containerized-infrastructure/micro/adderservice/wiring.js delete mode 100644 Chapter10/using-containerized-infrastructure/micro/auditservice/index.js delete mode 100644 Chapter10/using-containerized-infrastructure/micro/auditservice/package.json delete mode 100644 Chapter10/using-containerized-infrastructure/micro/auditservice/service.js delete mode 100644 Chapter10/using-containerized-infrastructure/micro/auditservice/wiring.js delete mode 100644 Chapter10/using-containerized-infrastructure/micro/fuge/fuge.yml delete mode 100644 Chapter10/using-containerized-infrastructure/micro/fuge/fuge2.yml delete mode 100644 Chapter10/using-containerized-infrastructure/micro/webapp/app.js delete mode 100644 Chapter10/using-containerized-infrastructure/micro/webapp/bin/www delete mode 100644 Chapter10/using-containerized-infrastructure/micro/webapp/package.json delete mode 100644 Chapter10/using-containerized-infrastructure/micro/webapp/public/stylesheets/style.css delete mode 100644 Chapter10/using-containerized-infrastructure/micro/webapp/routes/add.js delete mode 100644 Chapter10/using-containerized-infrastructure/micro/webapp/routes/audit.js delete mode 100644 Chapter10/using-containerized-infrastructure/micro/webapp/routes/index.js delete mode 100644 Chapter10/using-containerized-infrastructure/micro/webapp/routes/users.js delete mode 100644 Chapter10/using-containerized-infrastructure/micro/webapp/views/add.ejs delete mode 100644 Chapter10/using-containerized-infrastructure/micro/webapp/views/audit.ejs delete mode 100644 Chapter10/using-containerized-infrastructure/micro/webapp/views/error.ejs delete mode 100644 Chapter10/using-containerized-infrastructure/micro/webapp/views/index.ejs delete mode 100644 Chapter11/building-a-single-container/micro/adderservice/.dockerignore delete mode 100644 Chapter11/building-a-single-container/micro/adderservice/Dockerfile delete mode 100644 Chapter11/building-a-single-container/micro/adderservice/index.js delete mode 100644 Chapter11/building-a-single-container/micro/adderservice/package.json delete mode 100644 Chapter11/building-a-single-container/micro/adderservice/service.js delete mode 100644 Chapter11/building-a-single-container/micro/adderservice/wiring.js delete mode 100644 Chapter11/building-a-single-container/test.sh delete mode 100644 Chapter11/creating-a-deployment-pipeline/micro/adderservice/.dockerignore delete mode 100644 Chapter11/creating-a-deployment-pipeline/micro/adderservice/Dockerfile delete mode 100644 Chapter11/creating-a-deployment-pipeline/micro/adderservice/Jenkinsfile delete mode 100644 Chapter11/creating-a-deployment-pipeline/micro/adderservice/build.sh delete mode 100644 Chapter11/creating-a-deployment-pipeline/micro/adderservice/index.js delete mode 100644 Chapter11/creating-a-deployment-pipeline/micro/adderservice/package.json delete mode 100644 Chapter11/creating-a-deployment-pipeline/micro/adderservice/service.js delete mode 100644 Chapter11/creating-a-deployment-pipeline/micro/adderservice/wiring.js delete mode 100644 Chapter11/creating-a-deployment-pipeline/micro/deployment/deployment-template.yml delete mode 100644 Chapter11/creating-a-deployment-pipeline/micro/deployment/namespace.yml delete mode 100644 Chapter11/creating-a-deployment-pipeline/micro/deployment/service-template.yml delete mode 100644 Chapter11/deploying-a-container-to-kubernetes/micro/adderservice/.dockerignore delete mode 100644 Chapter11/deploying-a-container-to-kubernetes/micro/adderservice/Dockerfile delete mode 100644 Chapter11/deploying-a-container-to-kubernetes/micro/adderservice/index.js delete mode 100644 Chapter11/deploying-a-container-to-kubernetes/micro/adderservice/package.json delete mode 100644 Chapter11/deploying-a-container-to-kubernetes/micro/adderservice/service.js delete mode 100644 Chapter11/deploying-a-container-to-kubernetes/micro/adderservice/wiring.js delete mode 100644 Chapter11/deploying-a-container-to-kubernetes/micro/deployment/adderservice-dep.yml delete mode 100644 Chapter11/deploying-a-container-to-kubernetes/micro/deployment/adderservice-svc.yml delete mode 100644 Chapter11/deploying-a-container-to-kubernetes/micro/deployment/namespace.yml delete mode 100644 Chapter11/deploying-a-container-to-kubernetes/micro2/adderservice/.dockerignore delete mode 100644 Chapter11/deploying-a-container-to-kubernetes/micro2/adderservice/Dockerfile delete mode 100644 Chapter11/deploying-a-container-to-kubernetes/micro2/adderservice/index.js delete mode 100644 Chapter11/deploying-a-container-to-kubernetes/micro2/adderservice/package.json delete mode 100644 Chapter11/deploying-a-container-to-kubernetes/micro2/adderservice/service.js delete mode 100644 Chapter11/deploying-a-container-to-kubernetes/micro2/adderservice/wiring.js delete mode 100644 Chapter11/deploying-a-container-to-kubernetes/micro2/deployment/adderservice-dep.yml delete mode 100644 Chapter11/deploying-a-container-to-kubernetes/micro2/deployment/adderservice-svc.yml delete mode 100644 Chapter11/deploying-a-container-to-kubernetes/micro2/deployment/namespace.yml delete mode 100644 Chapter11/deploying-a-container-to-kubernetes/test.sh delete mode 100644 Chapter11/deploying-a-full-system/micro/adderservice/.dockerignore delete mode 100644 Chapter11/deploying-a-full-system/micro/adderservice/Dockerfile delete mode 100644 Chapter11/deploying-a-full-system/micro/adderservice/Jenkinsfile delete mode 100644 Chapter11/deploying-a-full-system/micro/adderservice/build.sh delete mode 100644 Chapter11/deploying-a-full-system/micro/adderservice/index.js delete mode 100644 Chapter11/deploying-a-full-system/micro/adderservice/package.json delete mode 100644 Chapter11/deploying-a-full-system/micro/adderservice/service.js delete mode 100644 Chapter11/deploying-a-full-system/micro/adderservice/wiring.js delete mode 100644 Chapter11/deploying-a-full-system/micro/auditservice/.dockerignore delete mode 100644 Chapter11/deploying-a-full-system/micro/auditservice/Dockerfile delete mode 100644 Chapter11/deploying-a-full-system/micro/auditservice/Jenkinsfile delete mode 100644 Chapter11/deploying-a-full-system/micro/auditservice/build.sh delete mode 100644 Chapter11/deploying-a-full-system/micro/auditservice/index.js delete mode 100644 Chapter11/deploying-a-full-system/micro/auditservice/package.json delete mode 100644 Chapter11/deploying-a-full-system/micro/auditservice/service.js delete mode 100644 Chapter11/deploying-a-full-system/micro/auditservice/wiring.js delete mode 100644 Chapter11/deploying-a-full-system/micro/deployment/deployment-template.yml delete mode 100644 Chapter11/deploying-a-full-system/micro/deployment/namespace.yml delete mode 100644 Chapter11/deploying-a-full-system/micro/deployment/service-template.yml delete mode 100644 Chapter11/deploying-a-full-system/micro/eventservice/.dockerignore delete mode 100644 Chapter11/deploying-a-full-system/micro/eventservice/Dockerfile delete mode 100644 Chapter11/deploying-a-full-system/micro/eventservice/Jenkinsfile delete mode 100644 Chapter11/deploying-a-full-system/micro/eventservice/build.sh delete mode 100644 Chapter11/deploying-a-full-system/micro/eventservice/index.js delete mode 100644 Chapter11/deploying-a-full-system/micro/eventservice/package.json delete mode 100644 Chapter11/deploying-a-full-system/micro/eventservice/service.js delete mode 100644 Chapter11/deploying-a-full-system/micro/eventservice/wiring.js delete mode 100644 Chapter11/deploying-a-full-system/micro/fuge/fuge.yml delete mode 100644 Chapter11/deploying-a-full-system/micro/infrastructure/Jenkinsfile delete mode 100644 Chapter11/deploying-a-full-system/micro/infrastructure/build.sh delete mode 100644 Chapter11/deploying-a-full-system/micro/report/.dockerignore delete mode 100644 Chapter11/deploying-a-full-system/micro/report/Dockerfile delete mode 100644 Chapter11/deploying-a-full-system/micro/report/env.js delete mode 100644 Chapter11/deploying-a-full-system/micro/report/index.js delete mode 100644 Chapter11/deploying-a-full-system/micro/report/package.json delete mode 100644 Chapter11/deploying-a-full-system/micro/webapp/.dockerignore delete mode 100644 Chapter11/deploying-a-full-system/micro/webapp/Dockerfile delete mode 100644 Chapter11/deploying-a-full-system/micro/webapp/app.js delete mode 100644 Chapter11/deploying-a-full-system/micro/webapp/bin/www delete mode 100644 Chapter11/deploying-a-full-system/micro/webapp/lib/event-logger.js delete mode 100644 Chapter11/deploying-a-full-system/micro/webapp/package.json delete mode 100644 Chapter11/deploying-a-full-system/micro/webapp/public/stylesheets/style.css delete mode 100644 Chapter11/deploying-a-full-system/micro/webapp/routes/add.js delete mode 100644 Chapter11/deploying-a-full-system/micro/webapp/routes/audit.js delete mode 100644 Chapter11/deploying-a-full-system/micro/webapp/routes/index.js delete mode 100644 Chapter11/deploying-a-full-system/micro/webapp/routes/users.js delete mode 100644 Chapter11/deploying-a-full-system/micro/webapp/views/add.ejs delete mode 100644 Chapter11/deploying-a-full-system/micro/webapp/views/audit.ejs delete mode 100644 Chapter11/deploying-a-full-system/micro/webapp/views/error.ejs delete mode 100644 Chapter11/deploying-a-full-system/micro/webapp/views/index.ejs delete mode 100644 Chapter11/deploying-to-the-cloud/micro/adderservice/.dockerignore delete mode 100644 Chapter11/deploying-to-the-cloud/micro/adderservice/Dockerfile delete mode 100644 Chapter11/deploying-to-the-cloud/micro/adderservice/Jenkinsfile delete mode 100644 Chapter11/deploying-to-the-cloud/micro/adderservice/build.sh delete mode 100644 Chapter11/deploying-to-the-cloud/micro/adderservice/index.js delete mode 100644 Chapter11/deploying-to-the-cloud/micro/adderservice/package.json delete mode 100644 Chapter11/deploying-to-the-cloud/micro/adderservice/service.js delete mode 100644 Chapter11/deploying-to-the-cloud/micro/adderservice/wiring.js delete mode 100644 Chapter11/deploying-to-the-cloud/micro/auditservice/.dockerignore delete mode 100644 Chapter11/deploying-to-the-cloud/micro/auditservice/Dockerfile delete mode 100644 Chapter11/deploying-to-the-cloud/micro/auditservice/Jenkinsfile delete mode 100644 Chapter11/deploying-to-the-cloud/micro/auditservice/build.sh delete mode 100644 Chapter11/deploying-to-the-cloud/micro/auditservice/index.js delete mode 100644 Chapter11/deploying-to-the-cloud/micro/auditservice/package.json delete mode 100644 Chapter11/deploying-to-the-cloud/micro/auditservice/service.js delete mode 100644 Chapter11/deploying-to-the-cloud/micro/auditservice/wiring.js delete mode 100644 Chapter11/deploying-to-the-cloud/micro/deployment/deployment-template.yml delete mode 100644 Chapter11/deploying-to-the-cloud/micro/deployment/namespace.yml delete mode 100644 Chapter11/deploying-to-the-cloud/micro/deployment/service-template-lb.yml delete mode 100644 Chapter11/deploying-to-the-cloud/micro/deployment/service-template.yml delete mode 100644 Chapter11/deploying-to-the-cloud/micro/eventservice/.dockerignore delete mode 100644 Chapter11/deploying-to-the-cloud/micro/eventservice/Dockerfile delete mode 100644 Chapter11/deploying-to-the-cloud/micro/eventservice/Jenkinsfile delete mode 100644 Chapter11/deploying-to-the-cloud/micro/eventservice/build.sh delete mode 100644 Chapter11/deploying-to-the-cloud/micro/eventservice/index.js delete mode 100644 Chapter11/deploying-to-the-cloud/micro/eventservice/package.json delete mode 100644 Chapter11/deploying-to-the-cloud/micro/eventservice/service.js delete mode 100644 Chapter11/deploying-to-the-cloud/micro/eventservice/wiring.js delete mode 100644 Chapter11/deploying-to-the-cloud/micro/fuge/fuge.yml delete mode 100644 Chapter11/deploying-to-the-cloud/micro/infrastructure/Jenkinsfile delete mode 100644 Chapter11/deploying-to-the-cloud/micro/infrastructure/build.sh delete mode 100644 Chapter11/deploying-to-the-cloud/micro/report/.dockerignore delete mode 100644 Chapter11/deploying-to-the-cloud/micro/report/Dockerfile delete mode 100644 Chapter11/deploying-to-the-cloud/micro/report/env.js delete mode 100644 Chapter11/deploying-to-the-cloud/micro/report/index.js delete mode 100644 Chapter11/deploying-to-the-cloud/micro/report/package.json delete mode 100644 Chapter11/deploying-to-the-cloud/micro/webapp/.dockerignore delete mode 100644 Chapter11/deploying-to-the-cloud/micro/webapp/Dockerfile delete mode 100644 Chapter11/deploying-to-the-cloud/micro/webapp/app.js delete mode 100644 Chapter11/deploying-to-the-cloud/micro/webapp/bin/www delete mode 100644 Chapter11/deploying-to-the-cloud/micro/webapp/lib/event-logger.js delete mode 100644 Chapter11/deploying-to-the-cloud/micro/webapp/package.json delete mode 100644 Chapter11/deploying-to-the-cloud/micro/webapp/public/stylesheets/style.css delete mode 100644 Chapter11/deploying-to-the-cloud/micro/webapp/routes/add.js delete mode 100644 Chapter11/deploying-to-the-cloud/micro/webapp/routes/audit.js delete mode 100644 Chapter11/deploying-to-the-cloud/micro/webapp/routes/index.js delete mode 100644 Chapter11/deploying-to-the-cloud/micro/webapp/routes/users.js delete mode 100644 Chapter11/deploying-to-the-cloud/micro/webapp/views/add.ejs delete mode 100644 Chapter11/deploying-to-the-cloud/micro/webapp/views/audit.ejs delete mode 100644 Chapter11/deploying-to-the-cloud/micro/webapp/views/error.ejs delete mode 100644 Chapter11/deploying-to-the-cloud/micro/webapp/views/index.ejs delete mode 100644 Chapter11/running-a-docker-registry/micro/adderservice/.dockerignore delete mode 100644 Chapter11/running-a-docker-registry/micro/adderservice/Dockerfile delete mode 100644 Chapter11/running-a-docker-registry/micro/adderservice/index.js delete mode 100644 Chapter11/running-a-docker-registry/micro/adderservice/package.json delete mode 100644 Chapter11/running-a-docker-registry/micro/adderservice/service.js delete mode 100644 Chapter11/running-a-docker-registry/micro/adderservice/wiring.js delete mode 100644 Chapter11/running-a-docker-registry/micro/certs/localhost.crt delete mode 100644 Chapter11/running-a-docker-registry/micro/certs/localhost.key delete mode 100644 Chapter11/storing-images-on-dockerhub/micro/adderservice/.dockerignore delete mode 100644 Chapter11/storing-images-on-dockerhub/micro/adderservice/Dockerfile delete mode 100644 Chapter11/storing-images-on-dockerhub/micro/adderservice/index.js delete mode 100644 Chapter11/storing-images-on-dockerhub/micro/adderservice/package.json delete mode 100644 Chapter11/storing-images-on-dockerhub/micro/adderservice/service.js delete mode 100644 Chapter11/storing-images-on-dockerhub/micro/adderservice/wiring.js delete mode 100644 Chapter11/storing-images-on-dockerhub/test.sh diff --git a/Chapter01/debugging-with-devtools/app/future.js b/Chapter01/debugging-with-devtools/app/future.js deleted file mode 100644 index 152866a..0000000 --- a/Chapter01/debugging-with-devtools/app/future.js +++ /dev/null @@ -1,3 +0,0 @@ -module.exports = (age, gap) => { - return `In ${gap} years you will be ${Number(age) + gap}
` -} \ No newline at end of file diff --git a/Chapter01/debugging-with-devtools/app/index.js b/Chapter01/debugging-with-devtools/app/index.js deleted file mode 100644 index c90b47a..0000000 --- a/Chapter01/debugging-with-devtools/app/index.js +++ /dev/null @@ -1,10 +0,0 @@ -const express = require('express') -const app = express() -const past = require('./past') -const future = require('./future') - -app.get('/:age', (req, res) => { - res.send(past(req.params.age, 10) + future(req.params.future, 10)) -}) - -app.listen(3000) \ No newline at end of file diff --git a/Chapter01/debugging-with-devtools/app/package.json b/Chapter01/debugging-with-devtools/app/package.json deleted file mode 100644 index 8711bc5..0000000 --- a/Chapter01/debugging-with-devtools/app/package.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "name": "app", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" - }, - "keywords": [], - "author": "", - "license": "ISC", - "dependencies": { - "express": "^4.15.2" - } -} diff --git a/Chapter01/debugging-with-devtools/app/past.js b/Chapter01/debugging-with-devtools/app/past.js deleted file mode 100644 index f0ea5c7..0000000 --- a/Chapter01/debugging-with-devtools/app/past.js +++ /dev/null @@ -1,3 +0,0 @@ -module.exports = (age, gap) => { - return `${gap} years ago you were ${Number(age) - gap}
` -} \ No newline at end of file diff --git a/Chapter01/enabling-core-debug-logs/app/index.js b/Chapter01/enabling-core-debug-logs/app/index.js deleted file mode 100644 index c493e89..0000000 --- a/Chapter01/enabling-core-debug-logs/app/index.js +++ /dev/null @@ -1,11 +0,0 @@ -const express = require('express') -const app = express() - -app.get('/', (req, res) => res.send('hey')) - - -setTimeout(function myTimeout() { - console.log('I waited for you.') -}, 100) - -app.listen(3000) diff --git a/Chapter01/enabling-core-debug-logs/app/package.json b/Chapter01/enabling-core-debug-logs/app/package.json deleted file mode 100644 index 2619e97..0000000 --- a/Chapter01/enabling-core-debug-logs/app/package.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "name": "app", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" - }, - "keywords": [], - "author": "", - "license": "ISC", - "dependencies": { - "express": "^4.15.0" - } -} diff --git a/Chapter01/enabling-core-debug-logs/instrumented-app/index.js b/Chapter01/enabling-core-debug-logs/instrumented-app/index.js deleted file mode 100644 index 5c5fa9e..0000000 --- a/Chapter01/enabling-core-debug-logs/instrumented-app/index.js +++ /dev/null @@ -1,16 +0,0 @@ -const util = require('util') -const express = require('express') -const debug = util.debuglog('my-app') -const app = express() - -app.get('/', (req, res) => { - debug('incoming request on /', req.route) - res.send('hey') -}) - -setTimeout(function myTimeout() { - debug('timeout complete') - console.log('I waited for you.') -}, 100) - -app.listen(3000) diff --git a/Chapter01/enabling-core-debug-logs/instrumented-app/package.json b/Chapter01/enabling-core-debug-logs/instrumented-app/package.json deleted file mode 100644 index 2619e97..0000000 --- a/Chapter01/enabling-core-debug-logs/instrumented-app/package.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "name": "app", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" - }, - "keywords": [], - "author": "", - "license": "ISC", - "dependencies": { - "express": "^4.15.0" - } -} diff --git a/Chapter01/enabling-debug-logs/app/index.js b/Chapter01/enabling-debug-logs/app/index.js deleted file mode 100644 index 09f7dc5..0000000 --- a/Chapter01/enabling-debug-logs/app/index.js +++ /dev/null @@ -1,13 +0,0 @@ -const express = require('express') -const app = express() -const stylus = require('stylus') - -app.get('/some.css', (req, res) => { - const css = stylus(` - body - color:black - `).render() - res.send(css) -}) - -app.listen(3000) diff --git a/Chapter01/enabling-debug-logs/app/package.json b/Chapter01/enabling-debug-logs/app/package.json deleted file mode 100644 index 12edb60..0000000 --- a/Chapter01/enabling-debug-logs/app/package.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "name": "app", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" - }, - "keywords": [], - "author": "", - "license": "ISC", - "dependencies": { - "express": "^4.15.0", - "stylus": "^0.54.5" - } -} diff --git a/Chapter01/enabling-debug-logs/instrumented-app/index.js b/Chapter01/enabling-debug-logs/instrumented-app/index.js deleted file mode 100644 index 0d2748c..0000000 --- a/Chapter01/enabling-debug-logs/instrumented-app/index.js +++ /dev/null @@ -1,15 +0,0 @@ -const express = require('express') -const app = express() -const stylus = require('stylus') -const debug = require('debug')('my-app') - -app.get('/some.css', (req, res) => { - debug('css requested') - const css = stylus(` - body - color:black - `).render() - res.send(css) -}) - -app.listen(3000) diff --git a/Chapter01/enabling-debug-logs/instrumented-app/package.json b/Chapter01/enabling-debug-logs/instrumented-app/package.json deleted file mode 100644 index 14e3518..0000000 --- a/Chapter01/enabling-debug-logs/instrumented-app/package.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "name": "app", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" - }, - "keywords": [], - "author": "", - "license": "ISC", - "dependencies": { - "debug": "^2.6.2", - "express": "^4.15.0", - "stylus": "^0.54.5" - } -} diff --git a/Chapter01/enabling-debug-logs/logging-app/index.js b/Chapter01/enabling-debug-logs/logging-app/index.js deleted file mode 100644 index 09f7dc5..0000000 --- a/Chapter01/enabling-debug-logs/logging-app/index.js +++ /dev/null @@ -1,13 +0,0 @@ -const express = require('express') -const app = express() -const stylus = require('stylus') - -app.get('/some.css', (req, res) => { - const css = stylus(` - body - color:black - `).render() - res.send(css) -}) - -app.listen(3000) diff --git a/Chapter01/enabling-debug-logs/logging-app/package.json b/Chapter01/enabling-debug-logs/logging-app/package.json deleted file mode 100644 index 3f173b4..0000000 --- a/Chapter01/enabling-debug-logs/logging-app/package.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "name": "app", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1", - "dev": "node index.js", - "prod": "node -r pino-debug index.js" - }, - "keywords": [], - "author": "", - "license": "ISC", - "dependencies": { - "express": "^4.15.0", - "pino-debug": "^1.0.3", - "stylus": "^0.54.5" - } -} diff --git a/Chapter01/enabling-debug-logs/logging-app/package.json.save b/Chapter01/enabling-debug-logs/logging-app/package.json.save deleted file mode 100644 index 1c20e7f..0000000 --- a/Chapter01/enabling-debug-logs/logging-app/package.json.save +++ /dev/null @@ -1,18 +0,0 @@ -{ - "name": "app", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1", - "start": "node - }, - "keywords": [], - "author": "", - "license": "ISC", - "dependencies": { - "express": "^4.15.0", - "pino-debug": "^1.0.2", - "stylus": "^0.54.5" - } -} diff --git a/Chapter01/enhancing-stack-traces/app/content.js b/Chapter01/enhancing-stack-traces/app/content.js deleted file mode 100644 index 82ac395..0000000 --- a/Chapter01/enhancing-stack-traces/app/content.js +++ /dev/null @@ -1,5 +0,0 @@ -function content (opts, c = 20) { - return --c ? content(opts, c) : opts.ohoh -} - -module.exports = content \ No newline at end of file diff --git a/Chapter01/enhancing-stack-traces/app/index.js b/Chapter01/enhancing-stack-traces/app/index.js deleted file mode 100644 index 3ec13c3..0000000 --- a/Chapter01/enhancing-stack-traces/app/index.js +++ /dev/null @@ -1,7 +0,0 @@ -const express = require('express') -const routes = require('./routes') -const app = express() - -app.use(routes) - -app.listen(3000) diff --git a/Chapter01/enhancing-stack-traces/app/package.json b/Chapter01/enhancing-stack-traces/app/package.json deleted file mode 100644 index 8711bc5..0000000 --- a/Chapter01/enhancing-stack-traces/app/package.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "name": "app", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" - }, - "keywords": [], - "author": "", - "license": "ISC", - "dependencies": { - "express": "^4.15.2" - } -} diff --git a/Chapter01/enhancing-stack-traces/app/routes.js b/Chapter01/enhancing-stack-traces/app/routes.js deleted file mode 100644 index 67e4e04..0000000 --- a/Chapter01/enhancing-stack-traces/app/routes.js +++ /dev/null @@ -1,9 +0,0 @@ -const content = require('./content') -const {Router} = require('express') -const router = new Router() - -router.get('/', (req, res) => { - res.send(content()) -}) - -module.exports = router \ No newline at end of file diff --git a/Chapter01/enhancing-stack-traces/async-stack-app/content.js b/Chapter01/enhancing-stack-traces/async-stack-app/content.js deleted file mode 100644 index 894e411..0000000 --- a/Chapter01/enhancing-stack-traces/async-stack-app/content.js +++ /dev/null @@ -1,9 +0,0 @@ -function content (opts, c = 20) { - function produce (cb) { - if (--c) setTimeout(produce, 10, cb) - cb(null, opts.ohoh) - } - return produce -} - -module.exports = content diff --git a/Chapter01/enhancing-stack-traces/async-stack-app/index.js b/Chapter01/enhancing-stack-traces/async-stack-app/index.js deleted file mode 100644 index 022e289..0000000 --- a/Chapter01/enhancing-stack-traces/async-stack-app/index.js +++ /dev/null @@ -1,10 +0,0 @@ -if (process.env.NODE_ENV !== 'production') { - require('longjohn') -} -const express = require('express') -const routes = require('./routes') -const app = express() - -app.use(routes) - -app.listen(3000) diff --git a/Chapter01/enhancing-stack-traces/async-stack-app/package.json b/Chapter01/enhancing-stack-traces/async-stack-app/package.json deleted file mode 100644 index e8f54a1..0000000 --- a/Chapter01/enhancing-stack-traces/async-stack-app/package.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "name": "app", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" - }, - "keywords": [], - "author": "", - "license": "ISC", - "dependencies": { - "express": "^4.15.2" - }, - "devDependencies": { - "longjohn": "^0.2.12" - } -} diff --git a/Chapter01/enhancing-stack-traces/async-stack-app/routes.js b/Chapter01/enhancing-stack-traces/async-stack-app/routes.js deleted file mode 100644 index ba48221..0000000 --- a/Chapter01/enhancing-stack-traces/async-stack-app/routes.js +++ /dev/null @@ -1,15 +0,0 @@ -const content = require('./content') -const {Router} = require('express') -const router = new Router() - -router.get('/', (req, res) => { - content()((err, html) => { - if (err) { - res.send(500) - return - } - res.send(html) - }) -}) - -module.exports = router \ No newline at end of file diff --git a/Chapter01/enhancing-stack-traces/infinite-stack-in-dev-app/content.js b/Chapter01/enhancing-stack-traces/infinite-stack-in-dev-app/content.js deleted file mode 100644 index 82ac395..0000000 --- a/Chapter01/enhancing-stack-traces/infinite-stack-in-dev-app/content.js +++ /dev/null @@ -1,5 +0,0 @@ -function content (opts, c = 20) { - return --c ? content(opts, c) : opts.ohoh -} - -module.exports = content \ No newline at end of file diff --git a/Chapter01/enhancing-stack-traces/infinite-stack-in-dev-app/index.js b/Chapter01/enhancing-stack-traces/infinite-stack-in-dev-app/index.js deleted file mode 100644 index e506871..0000000 --- a/Chapter01/enhancing-stack-traces/infinite-stack-in-dev-app/index.js +++ /dev/null @@ -1,10 +0,0 @@ -if (process.env.NODE_ENV !== 'production') { - Error.stackTraceLimit = Infinity -} -const express = require('express') -const routes = require('./routes') -const app = express() - -app.use(routes) - -app.listen(3000) diff --git a/Chapter01/enhancing-stack-traces/infinite-stack-in-dev-app/package.json b/Chapter01/enhancing-stack-traces/infinite-stack-in-dev-app/package.json deleted file mode 100644 index 8711bc5..0000000 --- a/Chapter01/enhancing-stack-traces/infinite-stack-in-dev-app/package.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "name": "app", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" - }, - "keywords": [], - "author": "", - "license": "ISC", - "dependencies": { - "express": "^4.15.2" - } -} diff --git a/Chapter01/enhancing-stack-traces/infinite-stack-in-dev-app/routes.js b/Chapter01/enhancing-stack-traces/infinite-stack-in-dev-app/routes.js deleted file mode 100644 index 67e4e04..0000000 --- a/Chapter01/enhancing-stack-traces/infinite-stack-in-dev-app/routes.js +++ /dev/null @@ -1,9 +0,0 @@ -const content = require('./content') -const {Router} = require('express') -const router = new Router() - -router.get('/', (req, res) => { - res.send(content()) -}) - -module.exports = router \ No newline at end of file diff --git a/Chapter01/enhancing-stack-traces/pretty-stack-app/content.js b/Chapter01/enhancing-stack-traces/pretty-stack-app/content.js deleted file mode 100644 index 74b887b..0000000 --- a/Chapter01/enhancing-stack-traces/pretty-stack-app/content.js +++ /dev/null @@ -1,5 +0,0 @@ -function content (opts, c = 20) { - return --c ? content(opts, c) : opts.ohoh -} - -module.exports = content diff --git a/Chapter01/enhancing-stack-traces/pretty-stack-app/index.js b/Chapter01/enhancing-stack-traces/pretty-stack-app/index.js deleted file mode 100644 index 730bf2f..0000000 --- a/Chapter01/enhancing-stack-traces/pretty-stack-app/index.js +++ /dev/null @@ -1,8 +0,0 @@ -require('cute-stack')() -const express = require('express') -const routes = require('./routes') -const app = express() - -app.use(routes) - -app.listen(3000) diff --git a/Chapter01/enhancing-stack-traces/pretty-stack-app/package.json b/Chapter01/enhancing-stack-traces/pretty-stack-app/package.json deleted file mode 100644 index 8d1b318..0000000 --- a/Chapter01/enhancing-stack-traces/pretty-stack-app/package.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "name": "app", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" - }, - "keywords": [], - "author": "", - "license": "ISC", - "dependencies": { - "cute-stack": "^1.4.3", - "express": "^4.15.2" - }, - "devDependencies": {} -} diff --git a/Chapter01/enhancing-stack-traces/pretty-stack-app/routes.js b/Chapter01/enhancing-stack-traces/pretty-stack-app/routes.js deleted file mode 100644 index 67e4e04..0000000 --- a/Chapter01/enhancing-stack-traces/pretty-stack-app/routes.js +++ /dev/null @@ -1,9 +0,0 @@ -const content = require('./content') -const {Router} = require('express') -const router = new Router() - -router.get('/', (req, res) => { - res.send(content()) -}) - -module.exports = router \ No newline at end of file diff --git a/Chapter03/communicating-over-sockets/client.js b/Chapter03/communicating-over-sockets/client.js deleted file mode 100644 index 08c9b8f..0000000 --- a/Chapter03/communicating-over-sockets/client.js +++ /dev/null @@ -1,16 +0,0 @@ -'use strict' - -const net = require('net') - -const socket = net.connect(1337, 'localhost') -const name = process.argv[2] || 'Dave' - -socket.write(name) - -socket.on('data', (data) => { - console.log(data.toString()) -}) - -socket.on('close', () => { - console.log('-> disconnected by server') -}) \ No newline at end of file diff --git a/Chapter03/communicating-over-sockets/net-sockets-are-streams/client.js b/Chapter03/communicating-over-sockets/net-sockets-are-streams/client.js deleted file mode 100644 index a5eeb2b..0000000 --- a/Chapter03/communicating-over-sockets/net-sockets-are-streams/client.js +++ /dev/null @@ -1,14 +0,0 @@ -'use strict' - -const net = require('net') - -const socket = net.connect(1337) -const name = process.argv[2] || 'Dave' - -socket.write(name) - -socket.pipe(process.stdout) - -socket.on('close', () => { - console.log('-> disconnected by server') -}) \ No newline at end of file diff --git a/Chapter03/communicating-over-sockets/net-sockets-are-streams/echo-client.js b/Chapter03/communicating-over-sockets/net-sockets-are-streams/echo-client.js deleted file mode 100644 index 3119883..0000000 --- a/Chapter03/communicating-over-sockets/net-sockets-are-streams/echo-client.js +++ /dev/null @@ -1,3 +0,0 @@ -'use strict' - -process.stdin.pipe(require('net').connect(1338)).pipe(process.stdout) \ No newline at end of file diff --git a/Chapter03/communicating-over-sockets/net-sockets-are-streams/echo-server.js b/Chapter03/communicating-over-sockets/net-sockets-are-streams/echo-server.js deleted file mode 100644 index 998f7e9..0000000 --- a/Chapter03/communicating-over-sockets/net-sockets-are-streams/echo-server.js +++ /dev/null @@ -1,3 +0,0 @@ -'use strict' - -require('net').createServer((socket) => socket.pipe(socket)).listen(1338) \ No newline at end of file diff --git a/Chapter03/communicating-over-sockets/net-sockets-are-streams/server.js b/Chapter03/communicating-over-sockets/net-sockets-are-streams/server.js deleted file mode 100644 index 8e25382..0000000 --- a/Chapter03/communicating-over-sockets/net-sockets-are-streams/server.js +++ /dev/null @@ -1,13 +0,0 @@ -'use strict' - -const net = require('net') - -net.createServer((socket) => { - console.log('-> client connected') - socket.once('data', name => { - socket.write(`Hi ${name}!`) - }) - socket.on('close', () => { - console.log('-> client disconnected') - }) -}).listen(1337) \ No newline at end of file diff --git a/Chapter03/communicating-over-sockets/server.js b/Chapter03/communicating-over-sockets/server.js deleted file mode 100644 index eaa9fc8..0000000 --- a/Chapter03/communicating-over-sockets/server.js +++ /dev/null @@ -1,13 +0,0 @@ -'use strict' - -const net = require('net') - -net.createServer((socket) => { - console.log('-> client connected') - socket.on('data', name => { - socket.write(`Hi ${name}!`) - }) - socket.on('close', () => { - console.log('-> client disconnected') - }) -}).listen(1337, 'localhost') \ No newline at end of file diff --git a/Chapter03/communicating-over-sockets/udp-sockets/client.js b/Chapter03/communicating-over-sockets/udp-sockets/client.js deleted file mode 100644 index 94f6d18..0000000 --- a/Chapter03/communicating-over-sockets/udp-sockets/client.js +++ /dev/null @@ -1,13 +0,0 @@ -'use strict' - -const dgram = require('dgram') - -const socket = dgram.createSocket('udp4') -const name = process.argv[2] || 'Dave' - -socket.bind(1400) -socket.send(name, 1339) - -socket.on('message', (data) => { - console.log(data.toString()) -}) diff --git a/Chapter03/communicating-over-sockets/udp-sockets/server.js b/Chapter03/communicating-over-sockets/udp-sockets/server.js deleted file mode 100644 index eebebf6..0000000 --- a/Chapter03/communicating-over-sockets/udp-sockets/server.js +++ /dev/null @@ -1,10 +0,0 @@ -'use strict' - -const dgram = require('dgram') - -const socket = dgram.createSocket('udp4') -socket.bind(1339) - -socket.on('message', (name) => { - socket.send(`Hi ${name}!`, 1400) -}) diff --git a/Chapter03/communicating-over-sockets/unix-sockets/client.js b/Chapter03/communicating-over-sockets/unix-sockets/client.js deleted file mode 100644 index baf60fe..0000000 --- a/Chapter03/communicating-over-sockets/unix-sockets/client.js +++ /dev/null @@ -1,16 +0,0 @@ -'use strict' - -const net = require('net') - -const socket = net.connect('/tmp/my.socket') -const name = process.argv[2] || 'Dave' - -socket.write(name) - -socket.on('data', (data) => { - console.log(data.toString()) -}) - -socket.on('close', () => { - console.log('-> disconnected by server') -}) \ No newline at end of file diff --git a/Chapter03/communicating-over-sockets/unix-sockets/server.js b/Chapter03/communicating-over-sockets/unix-sockets/server.js deleted file mode 100644 index d5a191a..0000000 --- a/Chapter03/communicating-over-sockets/unix-sockets/server.js +++ /dev/null @@ -1,13 +0,0 @@ -'use strict' - -const net = require('net') - -net.createServer((socket) => { - console.log('-> client connected') - socket.on('data', name => { - socket.write(`Hi ${name}!`) - }) - socket.on('close', () => { - console.log('-> client disconnected') - }) -}).listen('/tmp/my.socket') \ No newline at end of file diff --git a/Chapter03/fetching-meta-data/checking-file-existence/check.js b/Chapter03/fetching-meta-data/checking-file-existence/check.js deleted file mode 100644 index 0008c51..0000000 --- a/Chapter03/fetching-meta-data/checking-file-existence/check.js +++ /dev/null @@ -1,17 +0,0 @@ -'use strict' - -const fs = require('fs') - -const exists = (file) => new Promise((resolve, reject) => { - fs.access(file, (err) => { - if (err) { - if (err.code !== 'ENOENT') { return reject(err) } - return resolve({file, exists: false}) - } - resolve({file, exists: true}) - }) -}) - -exists(process.argv[2]) - .then(({file, exists}) => console.log(`"${file}" does${exists ? '' : ' not'} exist`)) - .catch(console.error) \ No newline at end of file diff --git a/Chapter03/fetching-meta-data/getting-symlink-information/meta.js b/Chapter03/fetching-meta-data/getting-symlink-information/meta.js deleted file mode 100644 index 89a835e..0000000 --- a/Chapter03/fetching-meta-data/getting-symlink-information/meta.js +++ /dev/null @@ -1,66 +0,0 @@ -'use strict' - -const fs = require('fs') -const path = require('path') -const tableaux = require('tableaux') - -const write = tableaux( - {name: 'Name', size: 20}, - {name: 'Created', size: 30}, - {name: 'Inode', size: 10}, - {name: 'Mode', size: 8}, - {name: 'Lnks', size: 4}, - {name: 'Size', size: 6} -) - -function print(dir) { - fs.readdirSync(dir) - .map((file) => ({file, dir})) - .map(toMeta) - .forEach(output) - write.newline() -} - -function toMeta({file, dir}) { - const stats = fs.lstatSync(path.join(dir, file)) - let {birthtime, ino, mode, nlink, size} = stats - birthtime = birthtime.toUTCString() - mode = mode.toString(8) - size += 'B' - return { - file, - dir, - info: [birthtime, ino, mode, nlink, size], - isDir: stats.isDirectory(), - isSymLink: stats.isSymbolicLink() - } -} - -function output({file, dir, info, isDir, isSymLink}) { - if (isSymLink) { - outputSymlink(file, dir, info) - return - } - write(file, ...info) - if (!isDir) { return } - const p = path.join(dir, file) - write.arrow() - fs.readdirSync(p).forEach((f) => { - const stats = fs.lstatSync(path.join(p, f)) - const style = stats.isDirectory() ? 'bold' : 'dim' - if (stats.isSymbolicLink()) { f = '\u001b[33m' + f + '\u001b[0m'} - write[style](f) - }) - write.newline() -} - -function outputSymlink(file, dir, info) { - write('\u001b[33m' + file + '\u001b[0m', ...info) - process.stdout.write('\u001b[33m') - write.arrow(4) - write.bold(fs.readlinkSync(path.join(dir, file))) - process.stdout.write('\u001b[0m') - write.newline() -} - -print(process.argv[2] || '.') diff --git a/Chapter03/fetching-meta-data/getting-symlink-information/my-folder/absolute-symlink b/Chapter03/fetching-meta-data/getting-symlink-information/my-folder/absolute-symlink deleted file mode 100644 index cad2309..0000000 --- a/Chapter03/fetching-meta-data/getting-symlink-information/my-folder/absolute-symlink +++ /dev/null @@ -1 +0,0 @@ -/tmp \ No newline at end of file diff --git a/Chapter03/fetching-meta-data/getting-symlink-information/my-folder/link-to-symlink b/Chapter03/fetching-meta-data/getting-symlink-information/my-folder/link-to-symlink deleted file mode 100644 index 8d501ff..0000000 --- a/Chapter03/fetching-meta-data/getting-symlink-information/my-folder/link-to-symlink +++ /dev/null @@ -1 +0,0 @@ -my-symlink \ No newline at end of file diff --git a/Chapter03/fetching-meta-data/getting-symlink-information/my-folder/my-file b/Chapter03/fetching-meta-data/getting-symlink-information/my-folder/my-file deleted file mode 100644 index 19e7bc3..0000000 --- a/Chapter03/fetching-meta-data/getting-symlink-information/my-folder/my-file +++ /dev/null @@ -1 +0,0 @@ -my edit diff --git a/Chapter03/fetching-meta-data/getting-symlink-information/my-folder/my-private-file b/Chapter03/fetching-meta-data/getting-symlink-information/my-folder/my-private-file deleted file mode 100644 index e69de29..0000000 diff --git a/Chapter03/fetching-meta-data/getting-symlink-information/my-folder/my-subdir/another-file b/Chapter03/fetching-meta-data/getting-symlink-information/my-folder/my-subdir/another-file deleted file mode 100644 index e69de29..0000000 diff --git a/Chapter03/fetching-meta-data/getting-symlink-information/my-folder/my-subdir/my-subsubdir/too-deep b/Chapter03/fetching-meta-data/getting-symlink-information/my-folder/my-subdir/my-subsubdir/too-deep deleted file mode 100644 index e69de29..0000000 diff --git a/Chapter03/fetching-meta-data/getting-symlink-information/my-folder/my-subdir/subdir-symlink b/Chapter03/fetching-meta-data/getting-symlink-information/my-folder/my-subdir/subdir-symlink deleted file mode 100644 index 993f945..0000000 --- a/Chapter03/fetching-meta-data/getting-symlink-information/my-folder/my-subdir/subdir-symlink +++ /dev/null @@ -1 +0,0 @@ -another-file \ No newline at end of file diff --git a/Chapter03/fetching-meta-data/getting-symlink-information/my-folder/my-symlink b/Chapter03/fetching-meta-data/getting-symlink-information/my-folder/my-symlink deleted file mode 100644 index 6f787df..0000000 --- a/Chapter03/fetching-meta-data/getting-symlink-information/my-folder/my-symlink +++ /dev/null @@ -1 +0,0 @@ -my-file \ No newline at end of file diff --git a/Chapter03/fetching-meta-data/getting-symlink-information/my-folder/relative-symlink b/Chapter03/fetching-meta-data/getting-symlink-information/my-folder/relative-symlink deleted file mode 100644 index 30676ba..0000000 --- a/Chapter03/fetching-meta-data/getting-symlink-information/my-folder/relative-symlink +++ /dev/null @@ -1 +0,0 @@ -../meta.js \ No newline at end of file diff --git a/Chapter03/fetching-meta-data/getting-symlink-information/my-folder/too-deep b/Chapter03/fetching-meta-data/getting-symlink-information/my-folder/too-deep deleted file mode 100644 index 675b184..0000000 --- a/Chapter03/fetching-meta-data/getting-symlink-information/my-folder/too-deep +++ /dev/null @@ -1 +0,0 @@ -my-subdir/my-subsubdir/too-deep \ No newline at end of file diff --git a/Chapter03/fetching-meta-data/manipulating-meta-data/make-file-efficiently.js b/Chapter03/fetching-meta-data/manipulating-meta-data/make-file-efficiently.js deleted file mode 100644 index 76f6308..0000000 --- a/Chapter03/fetching-meta-data/manipulating-meta-data/make-file-efficiently.js +++ /dev/null @@ -1,26 +0,0 @@ -'use strict' - -const fs = require('fs') -const {execSync} = require('child_process') - -const file = process.argv[2] -if (!file) { - console.error('specify a file') - process.exit(1) -} -try { - fs.accessSync(file) - console.error('file already exists') - process.exit(1) -} catch (e) { - makeIt() -} - -function makeIt() { - const nobody = Number(execSync('id -u nobody').toString().trim()) - const fd = fs.openSync(file, 'w') - fs.fchmodSync(fd, 0) - fs.fchownSync(fd, nobody, nobody) - console.log(file + ' created') -} - diff --git a/Chapter03/fetching-meta-data/manipulating-meta-data/make-file.js b/Chapter03/fetching-meta-data/manipulating-meta-data/make-file.js deleted file mode 100644 index 57c26f9..0000000 --- a/Chapter03/fetching-meta-data/manipulating-meta-data/make-file.js +++ /dev/null @@ -1,25 +0,0 @@ -'use strict' - -const fs = require('fs') -const {execSync} = require('child_process') - -const file = process.argv[2] -if (!file) { - console.error('specify a file') - process.exit(1) -} -try { - fs.accessSync(file) - console.error('file already exists') - process.exit(1) -} catch (e) { - makeIt() -} - -function makeIt() { - const nobody = Number(execSync('id -u nobody').toString().trim()) - fs.writeFileSync(file, '') - fs.chownSync(file, nobody, nobody) - fs.chmodSync(file, 0) - console.log(file + ' created') -} \ No newline at end of file diff --git a/Chapter03/fetching-meta-data/meta.js b/Chapter03/fetching-meta-data/meta.js deleted file mode 100644 index 95ae804..0000000 --- a/Chapter03/fetching-meta-data/meta.js +++ /dev/null @@ -1,51 +0,0 @@ -'use strict' - -const fs = require('fs') -const path = require('path') -const tableaux = require('tableaux') - -const write = tableaux( - {name: 'Name', size: 20}, - {name: 'Created', size: 30}, - {name: 'Inode', size: 10}, - {name: 'Mode', size: 8}, - {name: 'Lnks', size: 4}, - {name: 'Size', size: 6} -) - -function print(dir) { - fs.readdirSync(dir) - .map((file) => ({file, dir})) - .map(toMeta) - .forEach(output) - write.newline() -} - -function toMeta({file, dir}) { - const stats = fs.statSync(path.join(dir, file)) - let {birthtime, ino, mode, nlink, size} = stats - birthtime = birthtime.toUTCString() - mode = mode.toString(8) - size += 'B' - return { - file, - dir, - info: [birthtime, ino, mode, nlink, size], - isDir: stats.isDirectory() - } -} - -function output({file, dir, info, isDir}) { - write(file, ...info) - if (!isDir) { return } - const p = path.join(dir, file) - write.arrow() - fs.readdirSync(p).forEach((f) => { - const stats = fs.statSync(path.join(p, f)) - const style = stats.isDirectory() ? 'bold' : 'dim' - write[style](f) - }) - write.newline() -} - -print(process.argv[2] || '.') diff --git a/Chapter03/fetching-meta-data/my-folder/my-file b/Chapter03/fetching-meta-data/my-folder/my-file deleted file mode 100644 index 19e7bc3..0000000 --- a/Chapter03/fetching-meta-data/my-folder/my-file +++ /dev/null @@ -1 +0,0 @@ -my edit diff --git a/Chapter03/fetching-meta-data/my-folder/my-private-file b/Chapter03/fetching-meta-data/my-folder/my-private-file deleted file mode 100644 index e69de29..0000000 diff --git a/Chapter03/fetching-meta-data/my-folder/my-subdir/another-file b/Chapter03/fetching-meta-data/my-folder/my-subdir/another-file deleted file mode 100644 index e69de29..0000000 diff --git a/Chapter03/fetching-meta-data/my-folder/my-subdir/my-subsubdir/too-deep b/Chapter03/fetching-meta-data/my-folder/my-subdir/my-subsubdir/too-deep deleted file mode 100644 index e69de29..0000000 diff --git a/Chapter03/fetching-meta-data/my-folder/my-symlink b/Chapter03/fetching-meta-data/my-folder/my-symlink deleted file mode 100644 index 6f787df..0000000 --- a/Chapter03/fetching-meta-data/my-folder/my-symlink +++ /dev/null @@ -1 +0,0 @@ -my-file \ No newline at end of file diff --git a/Chapter03/fetching-meta-data/package.json b/Chapter03/fetching-meta-data/package.json deleted file mode 100644 index a8ac8ce..0000000 --- a/Chapter03/fetching-meta-data/package.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "name": "fetching-meta-data", - "version": "1.0.0", - "description": "", - "main": "meta.js", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" - }, - "author": "David Mark Clements", - "license": "MIT", - "dependencies": { - "tableaux": "^1.0.1" - } -} diff --git a/Chapter03/interfacing-with-standard-io/base64.js b/Chapter03/interfacing-with-standard-io/base64.js deleted file mode 100644 index 19a1796..0000000 --- a/Chapter03/interfacing-with-standard-io/base64.js +++ /dev/null @@ -1,6 +0,0 @@ -'use strict' - -process.stdin.on('data', data => { - process.stderr.write(`Converting: "${data}" to base64\n`) - process.stdout.write(data.toString('base64') + '\n') -}) diff --git a/Chapter03/interfacing-with-standard-io/piping/base64.js b/Chapter03/interfacing-with-standard-io/piping/base64.js deleted file mode 100644 index dc5a502..0000000 --- a/Chapter03/interfacing-with-standard-io/piping/base64.js +++ /dev/null @@ -1,4 +0,0 @@ -'use strict' - -const encode = require('base64-encode-stream') -process.stdin.pipe(encode()).pipe(process.stdout) \ No newline at end of file diff --git a/Chapter03/interfacing-with-standard-io/piping/package.json b/Chapter03/interfacing-with-standard-io/piping/package.json deleted file mode 100644 index b8e23bb..0000000 --- a/Chapter03/interfacing-with-standard-io/piping/package.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "name": "piping", - "version": "1.0.0", - "main": "base64.js", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" - }, - "author": "David Mark Clements", - "license": "MIT", - "dependencies": { - "base64-encode-stream": "^1.0.0" - }, - "devDependencies": {}, - "keywords": [], - "description": "" -} diff --git a/Chapter03/watching-files-and-directories/my-file.txt b/Chapter03/watching-files-and-directories/my-file.txt deleted file mode 100644 index 9744e43..0000000 --- a/Chapter03/watching-files-and-directories/my-file.txt +++ /dev/null @@ -1 +0,0 @@ -back again diff --git a/Chapter03/watching-files-and-directories/package.json b/Chapter03/watching-files-and-directories/package.json deleted file mode 100644 index 554bfe0..0000000 --- a/Chapter03/watching-files-and-directories/package.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "name": "watching-files-and-directories", - "version": "1.0.0", - "description": "", - "main": "watcher.js", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" - }, - "keywords": [], - "author": "David Mark Clements", - "license": "MIT", - "dependencies": { - "human-time": "0.0.1" - } -} diff --git a/Chapter03/watching-files-and-directories/watcher.js b/Chapter03/watching-files-and-directories/watcher.js deleted file mode 100644 index 4c45cf1..0000000 --- a/Chapter03/watching-files-and-directories/watcher.js +++ /dev/null @@ -1,44 +0,0 @@ -'use strict' - -const fs = require('fs') -const human = require('human-time') - -const interval = 5007 -const file = process.argv[2] -let exists = false - -if (!file) { - console.error('supply a file') - process.exit(1) -} - -const created = ({birthtime}) => - !exists && (Date.now() - birthtime) < interval - -const missing = ({birthtime, mtime, atime, ctime}) => - !(birthtime|mtime|atime|ctime) - -const updated = (cur, prv) => cur.mtime !== prv.mtime - -fs.watchFile(file, {interval}, (cur, prv) => { - if (missing(cur)) { - const msg = exists ? 'removed' : 'doesn\'t exist' - exists = false - return console.log(`${file} ${msg}`) - } - - if (created(cur)) { - exists = true - return console.log(`${file} created ${human((cur.birthtime))}`) - } - - exists = true - - if (updated(cur, prv)) { - return console.log(`${file} updated ${human((cur.mtime))}`) - } - - console.log(`${file} modified ${human((cur.mtime))}`) -}) - - diff --git a/Chapter03/watching-files-and-directories/watching-with-chokidar/package.json b/Chapter03/watching-files-and-directories/watching-with-chokidar/package.json deleted file mode 100644 index ff408a5..0000000 --- a/Chapter03/watching-files-and-directories/watching-with-chokidar/package.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "name": "watching-with-chokidar", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" - }, - "keywords": [], - "author": "David Mark Clements", - "license": "MIT", - "dependencies": { - "chokidar": "^1.6.0", - "human-time": "0.0.1" - } -} diff --git a/Chapter03/watching-files-and-directories/watching-with-chokidar/watcher.js b/Chapter03/watching-files-and-directories/watching-with-chokidar/watcher.js deleted file mode 100644 index 398c83d..0000000 --- a/Chapter03/watching-files-and-directories/watching-with-chokidar/watcher.js +++ /dev/null @@ -1,28 +0,0 @@ -'use strict' - -const chokidar = require('chokidar') -const human = require('human-time') -const watcher = chokidar.watch(process.argv[2] || '.', { - alwaysStat: true -}) - -watcher.on('ready', () => { - watcher - .on('add', (file, stat) => { - console.log(`${file} created ${human((stat.birthtime))}`) - }) - .on('unlink', (file) => { - console.log(`${file} removed`) - }) - .on('change', (file, stat) => { - const msg = (+stat.ctime === +stat.mtime) ? 'updated' : 'modified' - console.log(`${file} ${msg} ${human((stat.ctime))}`) - }) - .on('addDir', (dir, stat) => { - console.log(`${dir} folder created ${human((stat.birthtime))}`) - }) - .on('unlinkDir', (dir) => { - console.log(`${dir} folder removed`) - }) -}) - \ No newline at end of file diff --git a/Chapter03/working-with-files/asynchronous-file-operations/clean.dat b/Chapter03/working-with-files/asynchronous-file-operations/clean.dat deleted file mode 100644 index 7a137ed..0000000 --- a/Chapter03/working-with-files/asynchronous-file-operations/clean.dat +++ /dev/null @@ -1,140 +0,0 @@ -��b�V���������E��E�����h]k�������������0��R���|p}8R�@��_��R�S�x��!�S��|p}�S�@��_��v�yS�����������@��_�����������Y�(R�h]{�������������|�ha@R�-�-���|������������������R�����^�������������T��T��V��]��^�(d�`d�Xf�g��l�xr�8s��s��v�w��w�p}0U����_�V�0V��V�p}�V����_�����h]w������������x��wh] w�������������� wxi w��������8U��l w�������������T�U��U��U�xiw���������U�8-��lw����������������PU��U�a�^w���������T�V�����Xew`V�h])w��������������-wxi-w��������0W��l-w�������������V�W��W��W�`2��W�xi9w���������W�����@-��l.w����������������HW��W��xi@w���������X�:H-��p}w}���������@��_������������Ɛx̐�̐�͐ϐА@ѐpҐhؐ -��������������ĐXe -�HƐh]W�������������襐HȐ�ȐP���������8�Ɛxi`���������Pǐ�A��p\����������Ɛ ǐ`���������ΐh]J}���������������S}h]V}���������������W}xiZ}���������Ȑ.�`oX}��������&�Ȑ�Ȑ^T}��������HȐɐ����XeJ}@ɐfg}����h��������hg+}HÐxÐ�ɐ�����e�}����h����hgq|��@��ʐ����h]�}������������P���}xi�}���������ʐ .�xi�}��������ː��(.��p�}��������-Xʐ�ʐ`���������ː�АHҐX���͐��|p}�͐@��_��ΐ�ΐ�ΐPϐ�|p}pϐ@��_��}E~����������@��_�͐��������������������襐h]�����������������l��������0͐^u���������x̐ΐ����Xep�hΐ0Аѐ8ѐL�hǐ�ǐ�ΐ����h]���������������5��xi�����������0�l��������������Hϐ�А�А�ѐ����������x��h]~�������������੐~xi"~������������P�^ ~��������0АhА��������Xe~�Аh]1~������������P��4~h]7~����������������8~xi;~�����������ѐ0.�`o9~��������&8ѐpѐ^5~��������ѐ�ѐ����Xe1~�ѐ�h����hg�}���� ː`ː`Ґ����h]P~������������x��T~xiY~��������Ӑ.8.��pU~��������-�Ґ�Ґ`���������Ӑ|(ܐ���_��Ր�Ր֐�֐X���Ր��|p}�Ր@��_��֐�֐�֐Pא�|p}pא@��_�b~*������@��_���������hؐ0ؐ8ِpِڐېh]����������������xi�����אl����xא�אh]�~������������蟐�~xi�~�������������ؐ@.�xi�~����������ؐ��H.��p�~����������-0ؐ�ؐh]�~������������蟐�~h]�~����������������~� ^�~��������8ِpِ�����Xe�~�ِh]�~��������������xi���������xڐP.��p���������-ڐHڐ�n��������5�ڐh]��������������xi ��������hېX.�^��������ې8ې����Xe�ې�h����hg�~�ڐ�ې�ې����hg�~�ؐ�ِ�ې����`�����������@��ÐHȐ�ȐXʐ0Аѐ8ѐ�Ґ0ؐ8ِpِڐې`ݐh���3�@@��O��Y�Xi�xs�H������˃������P��%�h]4������������蟐<xiB����������ݐ`.�xiA���������ސ��h.��p=���������-`ݐ�ݐ�n=���������5(ސ`���������ސK����@����)�0f��p��r��s����Տ��h��`��X��������X�������|p}��@��_�������������|p}���@��_�E�������@��_���������h��h]����������������xi������������p.�xi�����������������x.�^���������h���������Xe��0���h����hg0� hސ�ސ�������hgL~ Ӑ`Ӑ�������H��������`�����������@��ÐHȐ�ȐXʐ0Аѐ8ѐ�Ґ0ؐ8ِpِڐې`ݐh��8���|p}x��إ������ج�x����`��x��8��ر�H��h����� ������������ԃփ8ƒ�ƒ�ȃ�Ƀ�Ƀ�˃�̃p̓�ԃ�Ճ�փ�ۃ�ۃ`܃����������������8�������������������������(��������������8��p��(�`�`��� �x�������X�����0�h��@������,�x-�x.�8/��T��T��V��]��^�(d�`d�Xf�g��l�xr�8s��s��v�w��w��}��~�`�������x��H����ȗ�@�����H����@�����0�����@�����0�����(��P�����8�����H��H��������`�����������@��ÐHȐ�ȐXʐ0Аѐ8ѐ�Ґ0ؐ8ِpِڐې`ݐh����������������������H�������`�����X�H�������H�8�p����������������������P �@!�x!�p"�0#� $�X$��&�H'�8(�p(��*�p+�0,�h-��.� /��/�1��2�h]K�������������8��O�`�����������X��0��������|p}�����_�������������|p}������_�Q�x�h]�������������蟐�����xi�������������.�xi���������8�����.��p���������-�����h]!�������������P��$�xi*�������������.�xi)���������@�����.��p%���������-�����`o���������P��X��h]x�����������������xi����������@���.��p����������-�����`o,������������X��h]ـ��������������������xi����������@���.��p����������-�����h]��������������蟐��h]�������������P���xi -�����������8���.�`o���������'������p���������-���P��`o����������X�����h]�������������蟐 �h]%����������������.�xi1�������������.�`o/���������&H������p!�����������-�����`o ��������������`o�������������H��`����������^� �����������Xe���h]��� ��������x������|p}8��@��_������8�� ����|p}���@��_�5� -����������@��_��������������X������|���*�����p����_��������������`�����X�H�������H�8�p���H��:-����v�= `�� ������h]A�������������P��D�xiJ������������.�xiI���������H�����.��pE���������-������nE����������5`��`����������������� ���������HC ���������������� ����|p}@��@��_��� ��@�� ����|p}���@��_�M����������@��_���������h]�����������5������������z����������� ��������h]�������������������`�����X�H�������H�8�p�����������H���l�����������������������������hg���(�����h]����h][����������������d�xii���������������.��pe���������-����h]n�������������p��x�`ok��������� �`�h]��������������0����xi����������@�p�l�����������������h]��������������0����xi������������h�l�������������������h]����������������������xi������������ Ol��������������X���(�H���h�h]�������������� ����h]��������������P�����l���������������������e^�����������������^����������X������� Xe��`�h]ˁ������������0��΁xi΁��������0�� p�l΁���������������h]ց������������0��فxiف����������� h�lف����������������h]������������������� xi������������� Ol��������������H����8�p�����h]��������������������h]��������������P�����l�����������������������^߁���������������^ԁ��������H� �����XeˁP �hgW� ����� ������h����hg=�������� �����`��������p -�����X&�P)�|�@ -�HC ��� ��������HC ����x��x ���|p}� �@��_�X �x �P%�!��|p}8�@��_��F�����������@��_�����������ҏ�uرh ���� � u�(���� ���� -��ߎH�� ������}6� �P��A�������*� � � ���������������������P �@!�x!�p"�0#�������������� ������������������������pn�h]����������������%�xi*�����������`��.��p&���������-��0�h]/�������������p��9�`o,���������x���`��������x�������A�������*� � pn�����b -� -�����|p}��@��_�`����� ��|p}@�@��_�;���������@��_���'���������ߎ�����������E�������������Э.this_function]�6�P��s�`����������������������@�x�pxyzP�������h�P�h]E�������������0��H�xiH���������h�h�lH��������������8�h]P���������������T�xiT���������(� OlT�����������������������@�h][������������� ��b�h]d�������������蟐l��lU�����������������@���^N����������� �����XeE�x�h]w�������������0��z�xiz���������H�p�lz����������������h]������������������xi����������� Ol������������������p������רh]�������������� ����h]��������������P�����l������������������� �`���^����������`������Xew�X�`���������X"�8%��.�(/�p/� 1�h1��1�(7�� -����|p}0�@��_����0����|p}��@��_����֩������@��_�©��������h�����0��x��h�����`��������H�H�����P���P �@!�x!�p"�0#� $�X$�X1�X2��3��4��7��\��M� N�P�XP�hj��j�0l�xl�h]��������������0����xi������������h�l������������������h]����������������‚xi‚��������� � Ol‚������������P �� � !�@!�x!���h]ɂ���������������҂h]Ԃ������������蟐܂�lÂ������������������ �!�΀^���������� ��!�����Xe��"�h]��������������0����xi�����������"�p�l��������������p"��"�h]������������������xi�����������#� Ol��������������0#�h#�$� $�X$�PI�h]������������������h]�������������P�� ��l��������������������#��#�%�^�����������"��$�����Xe���$����������������������P �@!�x!�p"�0#� $�X$��&�H'�8(�p(�����H��������ؤ�hg���0�������h]�������������0���xi�����������&��l��������������&��&�h]&���������������*�xi*�����������'� Ol*�������������H'��'�(�8(�p(�(;�h]1�������������蟐9�h];�������������P��>��l+������������������'�(�^$���������'��(�����Xe�)�hg�������( -����� 4�������������x����`��Й�H��x��Р�ॐШ�Ȫ�ح����h)�P2��2�p��łXł�ł�Ƃ ǂقh]P����������������Y�xi\���������+��.��pZ����������0�*��*�h]e�������������0��h�xih����������+���lh�������������p+��+�h]o���������������s�xis����������,� Ols�������������0,�h,�-� -��-�@c�xiz����������P-��.�h]}������������������xi������������-��.�`o����������'h-��-��lt������������������,��,�^m����������+�(.�����Xee��.�h]��������������p����h]��������������0����xi�����������/���l�������������� /�X/�h]������������������xi����������H0� Ol���������������/�0��0��0�1��M�xi�����������1��.�h]ă������������ ��˃�l�������������������`0��0���^�����������/�P1�����Xe���1��h����hg���.��1�2�����hgL�0+��.� 2�����h]ڃ������������0��݃`fӃ�2�HC x���� ����h]�����������������2�����ha����3�x��h]�����������������2������v�o��������^�������������p3��3�����Xe�����3��t�o�����"��x��X���@��_��4��4��4��o�B�0��84�����xi��������05���xi�������x5�c5�H5���������delimiterg�]!��5� ���Cxi�������(6��5�;��]!�@6��g;�xi�������6�H6��5�x6���������xi������7���xi����������6�07���������posix]!����7��DA"xi��������7��7�xi���������7�8��������� j�K�����4������h]"�H��������9�#�ha��8��HC ��� #�^����D������8�`8�����Xe����P9�`'��:�@�H̔h]-��������������7�2�H�Ȋ�(�������xi[��������:�H��@<�H��|p}�K�@��_� =�@=�r�C'�V� �>�@��?��|p}>�@��_�t�����������@��_���������������Ċ���C���v@�Ƹ‰H -?��k�P� -P?�:-���PE��s���� �>�v�= `>��A�N����Ҋ�Ҋ`֊�֊8A��A�0C��C��D�xK�(V��I��M��N��O�8P�W��W�X�@X�pA�hC�0E��K��|��|�`~��~����0�H1�(3�HC �:�� ��������HC �:�H -����HC �:�� -������������ȋ Hˋ -�ϋ 0�� ��� ��h��(@���h@�xB�pD�8N��t����`�`}������@�0�`B�h]��������������`>���xi����������� A��h]���������������A���ha}�8A��:�HC �:�`>���h]�����������������A�����^��������������A��@�����Xe����B�`�������B���XD�h]������������������xi�����������P�h]���������������C���ha��0C��:�HC �:�����h]�����������������C�����^��������������C�C�����Xe����D�`�������D�h]�����������������h]��������������PE���ha���D��:�HC �:�����:�(G���|p}HG�@��_�H�(H��n�!�H��|p}�H�@��_�̄���������@��_����������Q����8���P�@Q�xR���P��Х���p�����蛎`ˎ�ˎ�I��M��N��O�8P�W��W�X�@X��]�(^��^��^��`�a��a�(ŽpŽ�Î�������� "��"��\� ]�h]ф������������@�҄h]Մ������������?�ބxiބ��������HJ�X�lބ�������������I�J�xi������������J�/�`o����������'`J��J�`̈́����pK��� N�h]��������������PM���hä́xK��E����0���PE��s�0���ۏ�ۏ���C���v@�PM�Ƹ‰� �>�v�= �V�&�(5H -?��k�P� -P?�:-������`>��A�N���@�HC �:�@���h]����������������PM�����^��������������M��J�����Xe�����M��cȄ�����P�(K��O��P�h]��������������PM���xi������������N�/�xi����������8O���/��p�����������2�N�O�h]���������������C���n����������5�O�`o����������PO��O�h] �������������PM� -�p -����������8P�����Xe -�pP�`��������Q��U��a��b� i�k��n�PxS�X�[�^�E� S���|p}@S�@��_�T� T�`k�!�T��|p}�T�@��_������������@��_�I����������d�1 ��23x����56P��(��89X+�X��;<�.�5�>�>�?X��@���A(+�BW��W�X�@X��]�(^��^��^��`�a��a�8b��b�Pi��i�Hj��P� ��(� ��`������U�h]������������� �h]��������������V��ha�(V��Q�HC �:� �@��pA�hC�0E��K�`V�h]*�������������PM�+�xi/���������xW�/��p,���������2W�HW�h]:��������������V�>�h]A�������������?�J�h]K�������������PM�L�lJ�������������X�@X�^?����������W�xX�����Xe:��X�`��������hY��`��a��[�^�h�kov y�Q�p[���|p}�[�@��_�P\�p\��\�]��|p}0]�@��_�Z���|�������@��_�ŀ�����������6P��78�|�X+�:;h��.�=>�>�X��@A(+�x��Cp �� -��]�(^��^��^��`�a�� �� �� ��P��� ��(� ��h]h�������������PE�k�h]p��������������ٔy��pl���������-�]�(^�h]��������������PE���h]��������������0ٔ��xi����������@_��l���������������^�_��_��l������������������X_��_�^�����������^��_�����Xe�� `��h����hgd�`^�p`��`�����h]���������������V���h]��������������PE���^�����������`�a�����Xe��8a�hg&��W�Y� Y�����h]����������������Džb�8b�h]ȅ�������������V�̅�l�������������������a�b�Xe��pb�h]���������������V���xi����������Hc�X�l���������������b�c�xi����������c� /��p���������-`c��c�`��������pd��h��Q�xf���|p}�f�@��_�Xg�xg��g�h��|p}8h�@��_� �$�������@��_����������e�8N��h����hg���c�(d�i�����h],��������������A�8�h];��������������V�?�xiB����������i�`�`o@���������&�i��i�h]H��������������A�T�`oF���������&j�Hj�^9���������Pi��j�����Xe,��j�h]\��������������C�l�W��W�X�@X��]�(^��^��^��`�a��a�8b��b�Pi��i�Hj�(k�hl�h]o��������������V�s�xis����������l��ls�������������hl��l�8m�Xm�xi����������m�(/��lt������������������l�(m�xi����������(n�/0/��p����������-�m��m�^m���������(k�@n�����Xe\��n��I��M��N��O�8P�W��W�X�@X��]�(^��^��^��`�a��a�8b��b�Pi��i�Hj�(k�hl�8A��A�0C��C��D�xK�(V��I��M��N��O�8P�W��W�X�@X��]�(^��^��^��`�a��a�8b��b�Pi��i�Hj�(k�hl��p�0q��q�h]S��������������A�_�h]b���������������v�xq��q� t�h]w��������������A���h]���������������C���8A��A�0C��C��D�xK�(V��I��M��N��O�8P�W��W�X�@X��]�(^��^��^��`�a��a�8b��b�Pi��i�Hj�(k�hl��p�0q��q��q�u�z��{��|�����n����������5�q��lb�����������������0q�hq�^`����������p�Pt�����XeS��t�h]���������������C���`���������u��|��:��w���|p}�w�@��_�xx��x��x�8y��|p}Xy�@��_��� �������@��_���������z��{�h]���������������A�̇xi̇���������z�X�l̇������������z�Pz�xiև��������{�8/��pԇ��������0�z��z�xi�����������{�`�h]���������������A���`o����������&`{��{�`f���{�xi���������h|�`�`f�8|�hg�� {� |��|�����h]*��������������A�6�xi6���������0}�X�l6��������������|�}�xi@����������}�@/��p>���������0H}��}�`��������X~����:�`����|p}���@��_�@��`��������|p} ��@��_�C�e�������@��_������������h]R��������������A�^�`fK����`��������x��H���:������|p}���@��_�`�������� ���|p}@��@��_�k���������@��_���������xiz���������0��(2�`fs���hg&��}�~�0������hg��u�Hu�`������HC �:�H�����h]�����������������������ha�������:�h]������������������������vd���������^�������������`���������Xe��������td������"H��:�@��@��_�������Ȋ�d�p:�(������xi������� ��x5�����x5��|p}���@��_���������!`��@������|p}���@��_�����������@��_����������EX���n�H -����k�P� -Џ�:-����������~� @��v�= А�&�(5А����h��Б�x��蔑��������������蜑P�����������������8�����HC 8��� ��������HC 8��H -��������HC 8��� -�������� �����h]��������������А���HC 8�� ����H�� -`��0��`����������ȥ�h]����������������ˆ���Б�h]È������������А�Lj�l������������������h�����Xe����h]ӈ������������А�׈xi׈�����������X�l׈������������x�����xi����������h��H/��p߈��������-���8��xi�������������(2�`f������h����hgψ����� ������`������������h]��������������E �h]�������������А��xi���������P���l�������������蔑 �����ؕ�xi �����������P/��l�����������������h�����xi'������������/X/��p#���������- ��x��h]'�������������X��)�ha����8��HC 8���E)�^����������������������Xe�������`4�����P�����h]:����������������K�h]N�������������А�R�xiR�������������lR����������������Ș�`�����h]^�������������А�b�xib���������虑X�lb�������������������xil���������p��`/�`oj���������'��@���lS�������������������P��xis���������P��/h/��po���������-Ț� ��h]s���������������u�ha4����8��HC 8�����u�^����������������h������Xe����H��h]��������������А���h]������������������0��P�����h]��������������А���h]��������������X��ȉ�n����������5����l������������������蜑 ��^��������������������Xe��H��h]ԉ������������А�؉xi؉����������X�l؉���������������螑xi�������������p/��p����������-0��p��h]��������������X�����n����������5���`o�������������0��h]��������������А��xi�����������(2�^������������ؠ�����Xe�� ���h����hgЉ`��p���������h]�������������А�����h��Б�x��蔑��������������蜑P��������������ȡ���������x��Ч�xi���������8��X�l�������������ȡ���xi������������x/��p���������0P�����h]#���������������4�`o ���������أ���h]<�������������А�@�xiD������������`�^A�������������Ȥ�`������`oB���������&���Ȥ�Xe<����h����hg �P������������h]R�������������X��\�xik���������`��`�h]q�������������А�u�`oo���������&0��x��`fd�����h����hgN�������������p��`��0��`����������ȥ�����h]��������������А���`f{�Ч�HC 8��x5�����h]���������������� ������ha����h��8��h]���������������� �������v����������^�����������������������Xe���� ���t�������"x5�8�����@��_�����(��������������xi�����������E� ���E�|p}@��@��_��� ��@�����������|p}୑@��_����������@��_���������H -讑�k�P� -0��:-��� ���v�= 0��&�(50�����Ȱ�0��ر� ����HC ���� ��������HC ���H -��������HC ���� -�������� �����h]��������������0����HC ��� �������එ���x��h]����������������NJ��0��h]Ȋ������������0��̊�l������������������Ȱ���Xe��h��h]ڊ������������0��ފxiފ��������@��X�lފ������������ر���xi����������Ȳ��/��p����������0X�����h]��������������0����xi��������������l�������������� ��X�������xi����������@���/��l���������������������೑xi���������഑/�/��p���������-X�����`o����������಑���`fӊ8��HC ����E����h]�����������������������ha����ص����h]������������������������v����������^�������������0��h������Xe��������t�������"�E���x���@��_������������P���������xi���������pv�����pv��|p}���@��_�p�����ۑ!0�����ߑX���|p}P��@��_�)���������@��_������������@�ƑƸ‰H -X���k�P� -���:-��p��hϑ�̙� ��v�= �~����v]�i���(���őϑHƑ8ǑpǑpȑ`Α�Α�ϑPБ�Б`ёxב�ב�ߑ`���őHϑHC ��� ��������HC ��H -����HC ��� -��������x��P��p������Ƒ8ݑ�ޑh]6�������������X��?�xi?��������� ��X�l?�������������������xiK�������������/��pG���������-8��x��xi[���������0��(2�`fT����h����hg2����H��`������`d�����近h]h��������������~�n�h]h����������������n�had�(����HC ���~�h���X‘��|p}x‘@��_�8ÑXÑxÑ�Ñ�|p}đ@��_�x�e�������@��_����������ɑHƑ8ǑpǑpȑ`Α�Α�ϑPБ�Б`ёxב�ב(ؑ`ّؑ�ّh]}�������������@�~�xi����������@ő�/�`y������ő�Ƒh]��������������Ƒ��hay��ő���HC ��@���h]����������������Ƒ����^�������������HƑő����Xe�����Ƒ�ct�����ɑXő0ȑ�ȑh]��������������Ƒ��h]��������������X����xi�����������ǑX�l��������������pǑ�Ǒ�p����������/8Ǒ�Ǒh]��������������Ƒ��p�����������pȑ����Xe���ȑ`��������Pɑ�͑Hё�ڑ���Xˑ��|p}xˑ@��_�8̑X̑x̑ �̑�|p}͑@��_���e�������@��_���������pӑ`Α�Α�ϑPБ�Б`ёxב�ב(ؑ`ّؑ�ّ`������ Α8Бh]��������������p����h]��������������X����h]��������������Ƒ��l��������������`Α�Αh]��������������hϑ��ha��ϑ�ɑHC ��p����h]����������������hϑ����^��������������ϑ�Α����Xe�����ϑh]ŋ��������������ϋ�Б�Бh]Ћ������������hϑӋ�lŋ����������������PБ�БXeŋ�Бh]��������������hϑ��xi�����������ёX�l��������������`ё�ёxi����������Pґ�/��p����������0�ё ґ`���������ґ�ڑ�ɑ�ԑ��|p}Ց@��_��Ց�Ց֑�֑�|p}�֑@��_���_�������@��_���������xב�ב(ؑ`ّؑ�ّh]������������������h] ��������������ٔ��p���������-xב�בh]����������������$�h]'�������������hϑ*�^%���������(ؑ`ؑ����Xe��ؑh]C����������������I�xiM���������hّ`�h]S�������������hϑV�`oQ���������&8ّ�ّ^J����������ّ�ّHڑ����`oK���������&ّ�ّXeC��ّhg���ב�ؑ�ڑ�����h����hg܋hґ�ґ�ڑ�������(���őϑHƑ8ǑpǑpȑ`Α�Α�ϑPБ�Б`ёxב�ב(ؑ`ّؑ�ّܑPܑhݑXޑh]n����������������t�h]y��������������ٔ���pu���������-ܑPܑxi�����������ܑ(2�`f���ܑ�h����hgj��ܑݑ(ݑ����h]���������������˔��xi�����������ݑx5�l��������������hݑ�ݑ8ޑXޑh]��������������������l�������������������ݑ(ޑ`f���ޑHC ��pv�����h]����������������ߑ����ha����Hߑ��h]����������������ߑ�����v���������^��������������ߑ�ߑ����Xe�������t������"pv���h���@��_�������������h�� ����xiÌ�����`��h)����h)��|p}�%� @��_�������{��z�n� ���(���|p}���@��_�ތr� ������@��_�������������/����潳�PE����~���H -���k�P� -H��:-��(U�fA��� ���v�= H/����v ���������H��`�����p����������������������(������H��p��� � ��h�}X����5�@H��v��)��.�{�(j�)����x���:�8�������x��h��`����������(�HC x��� ��������HC x��H -��������HC x��� -��������H/������/�H����h]ߌ�����������������h]�������������������HC x��H/�����HC x���/������+�#X��h�����������0��`��h]������������������������h]��������������������l������������������`�����Xe����h]����������������������h]������������������l�����������������p�����Xe���h]����������������"�h]'����������������)��p#���������-������xi8���������`���`f1�0���h����hg����x���������h]A����������������E�h]H��������������˔M�xiM���������p��H�lM���������������@��������h]V����������������Z��lN�����������������������^F������������0������XeA����h]a����������������c�h]f��������������˔k�xik������������H�lk�������������(��`�������h]t����������������v��ll�����������������������^d������������P������Xea����h]�������������������h]��������������������p����������-��H��xi��������������`f������h����hg~������ ������`ɍ�������`��h]͍������������PE�֍��H��`�����p����������������������(������H��8������������x�h������ �X���p �� -�� ���xiٍ�������� ���/�h]ٍ���������������ڍhaɍ8��x��HC x��PE�ڍh]�����������������������^�����������������������Xe������x������|p}(��@��_������(������|p}���@��_���U�������@��_���������p���������x�h��c���������������h]�������������������h]�������������������xi����������x��X�l����������������H���p����������/������h]���������������� �p����������������Xe�H��`���������������������|p}��@��_�������������|p}���@��_� �U�������@��_���������x�h�h]�����������������xi������������l�������������x���H�h�h])����������������2��l�������������������8�xi8���������(�/�/��p4���������-�����n4���������5@�fI�����h����hg�����������X��h�����������0��`��������� -�0�����!�8$�`Z���������h]^�������������(U�e�h]h����������������l�xil�����������X�ll��������������P�h]m���������������s�haZ���x���z�h���� X�P#����7 ����ˈ: �/����潳�(U���fA��� ���v�= H/����v �H -���k�P� -H��:-��k�8 �J��،�( ��(�A -PE����~���h�( �N��HC x��(U�s�h]����������������������^���������������������Xe����0�`y�������� �h]}�������������h���h]������������������h]�������������������`o����������' �X�h]��������������( ���hay���x��HC x��h���h]����������������( �����^�������������p �������Xe����� �`ǎ����X -� �h]ˎ������������k�ҎxiՎ��������� -��/�h]Վ������������8 �֎haǎ� -�x��HC x��k�֎h]����������������8 �����^�������������� �� -�����Xe����� �x��� ���|p}� �@��_�������P��|p}p�@��_���G�������@��_���������������� ���c܎����P�x�8�h]��������������8 ���h]�������������������xi���������� �X�l�������������������p����������/��8�h]��������������8 ��p�����������������Xe����`������������( �����|p}��@��_�������@��|p}`�@��_��G�������@��_��������� ��h]�����������������xi������������l������������� �X����h]�������������8 �$��l���������������������xi*�����������/�/��p&���������-H����n&���������5��f;�0��h����hg �(�X�p�������H��`�����p����������������������(������H��8������������x�h������ �X���p �� -�� ������� ��P���� �X���p ��!��!�H"��"��"��#�P%��(�`*�+�n�hr�1�P1��1�07�h7��<��<�0B� C�XC��I�`L��������h]P��������������z�U�h]X����������������Z�xiZ�����������X�lZ�������������P���h][�������������h�a�haL��x��HC x���z�a�p��� � �H� �0#��%��*�h]����������������h�����^���������������������Xe����0�`g�������� �h]k�������������،�p�h]t�������������h�y�h]|�������������8 ���`oz���������' �X�h]��������������( ���hag���x��HC x��،���h]����������������( �����^�������������p �������Xe����� �`ʏ����X!� $�h]Ώ������������X�ԏh]؏������������( �ߏh]��������������( ����p����������/�!��!�h]��������������( ���h]��������������( ���r؏��������"�H"��"�h]��������������P#���haʏ�"�x��HC x��X���h]����������������P#�����^��������������#��"�����Xe�����#�`������$�x)�h]�����������������xi����������$��/�xi���������8%����/�h]��������������(��ha�P%�x�����r��~�ހhn���<X�P#����7 �/����潳�(U���fA��@��*�Ƹ‰ k�8 �J��h�( �N������(��ˈ: H��@���GpB� ���v�= H/����v �،�( ��(�A -H -���k�P� -H��:-���z�h���� PE����~���HC x������h]�����������������(�����^��������������(�%�����Xe����()�`������)��+�h] �������������@�!�xi$���������H*��/�h]$��������������*�%�ha�`*�x��HC x��@�%�h]�����������������*�����^�������������+�*�����Xe����8+����X��h�����������0��`��������� -�0�����!�8$��)��0�����x��x��H.���|p}h.�@��_�(/�H/��y�C'�/��|p}0�@��_�/�ʔ������@��_���������(3�1�P1��1�07�h7��<��<�0B� C�XC��I�pJ��J�L��Q��R��c+�����`2��1�H2�h]2��������������*�3�h]7�������������P#�=��p4���������11�P1�h]A��������������*�B�pA�����������1�����XeA�2�`���������2�`k��k��o��x��,��4���|p}�4�@��_��5��5��t�C$P6��|p}p6�@��_�D�ʔ������@��_����������8�07�h7��<��<�0B� C�XC��I�pJ��J�L��Q��R��R�(T�`T�h]P��������������*�Q�h]V�������������P#�\��pR���������-07�h7�`��������(8�j�0j�(3�0:���|p}P:�@��_�;�0;��h�!�;��|p}�;�@��_�^���������@��_����������U��<��<�0B� C�XC��I�pJ��J�L��Q��R��R�(T�`T��Y��Z�h]l�������������( �q�h]t�������������P#�z��pr���������0�<��<�`���������=��S��8��?���|p}�?�@��_��@��@��@� -PA��|p}pA�@��_�|�)�������@��_����������M�0B� C�XC��I�pJ��J�L��Q��R��R�h]�������������������xi�����������B��l��������������0B�hB�C��C�h]��������������8 ���h]���������������*���`o����������& C�XC��l�������������������B��B�xi����������XD�/�/��p����������-�C�(D�`���������D�L�(>�G���|p} G�@��_��G�H� H��H��|p}�H�@��_���t�������@��_����������I�pJ��J�h]N����������������P�xiP����������I� OlP��������������I��I�PJ�hK�h]W�������������8 �^�h]a��������������*�b�`o_���������&pJ��J�xie���������PK��/�`oc���������&�J� K��lQ�����������������J�@J�`fG��K�h]~��������������*��xi�����������L��/��p����������-L�PL�`�������� M��S�(>�(O���|p}HO�@��_�P�(P�HP��P��|p}�P�@��_����������@��_����������Q��R��R�h]�������������������xi����������R� Ol���������������Q��Q�xR�S�h]�������������8 � �h]��������������*��`o���������&�R��R��l�����������������(R�hR�`f��HS��h����hgz��L��L��S�����hg��pD��D��S�����h]3�������������( �:�h]=�������������P#�C��p;���������0(T�`T�`�������� U��h��8�(W���|p}HW�@��_�X�(X�HX��X��|p}�X�@��_�E�ۓ������@��_���������Xc��Y��Z��Z��`�0a��a�`g�h]U����������������Y�xiY���������Z��lY��������������Y��Y�xZ�[�h]e����������������n�h]q��������������*�r�`oo���������&�Z��Z��lZ�����������������(Z�hZ�xix����������[�/0��pt���������-H[��[�`��������p\��a��U�x^���|p}�^�@��_�X_�x_��_�`��|p}8`�@��_���2�������@��_����������`�0a�h]��������������(�!�h]$��������������*�%�^"����������`�0a�����Xe�ha�h]<��������������*�=�xiB���������8b�0��p>���������-�a�b�`���������b�0h��U��d���|p}e�@��_��e��e�f��f��|p}�f�@��_�E�ѓ������@��_���������`g�h]���������������(���xiÓ���������g�0�^����������`g��g�����Xe���g��h����hg8�Pb��b�Hh�����hgQ��[�(\�Xh������<��<�0B� C�XC��I�pJ��J�L��Q��R��R�(T�`T��Y��Z��Z��`�0a��a�`g��h����hg/��T��T��i�����hgh� =�`=��i�����f���0�07�h7��<��<�0B� C�XC��I�pJ��J�L��Q��R��R�(T�`T��Y��Z��Z��`�0a��a�`g�l�m�@m�Ho�pp�`q��q�s��s��s��h����hgL��7��7�Pk�����`�������k��o�h]��������������ހ�h]���������������� �xi ����������l��l �������������l�Pl��l�xm�h]����������������!�h]$��������������*�%�`o"���������&m�@m��l ������������������l��l�h]%�������������hn�&�ha��n�(3�HC x��ހ &�(��p��� � �H� �0#��%��*�Hn��r� ��h]����������������hn�����^�������������Ho��m�����Xe�����o�`.�����0p��s�h]2���������������8�h];����������������=�xi=����������p��l=�������������pp��p�@q��q�h]I�������������8 �P�h]S��������������*�T�`oQ���������&`q��q��l>������������������p�0q�h]T��������������r�U�ha.�hr�(3�HC x���� -U�h]�����������������r�����^�������������s�r�����Xe����@s�h]a�������������hn�i�h]n��������������r�t��pj���������-�s��s��nj���������5t�f~��0�h]��������������hn���07�h7��<��<�0B� C�XC��I�pJ��J�L��Q��R��R�(T�`T��Y��Z��Z��`�0a��a�`g�l�m�@m�Ho�pp�`q��q�s��s��s��t�xw��w�xi���������� w�/0��p����������-�t��v�h]���������������(���h]”�������������*�Ô^����������xw��w�����Xe���w��h����hg��8w�8x�Px�����hg]�Xt��t�`x�����1�P1��1�07�h7��<��<�0B� C�XC��I�pJ��J�L��Q��R��R�(T�`T��Y��Z��Z��`�0a��a�`g�l�m�@m�Ho�pp�`q��q�1�P1��1�07�h7��<��<�0B� C�XC��I�pJ��J�L��Q��R��R�(T�`T��Y��Z��Z��`�0a��a�`g�l�m�@m�Ho�pp�`q��q�s��s��s��t�xw��w���H��`�����p����������������������(������H��8������������x�h������ �X���p �� -�� ������� ��P���� �X���p ��!��!�H"��"��"��#�P%��(�`*�+�n�hr�1�P1��1�07�h7��<��<�0B� C�XC��I�pJ��J�L��Q��R��R�(T�`T��Y��Z��Z��`�0a��a�`g�l�m�@m�Ho�pp�`q��q�s��s��s��t�xw��w�耒���8��p�����`�������x�����(����@��������H�����ț�������袒 ���������঒Ч�`Д����`����h]Ԕ������������H��הxiڔ��������Ѐ��h]ڔ������������@��ܔhaД耒x��HC x��H�� ܔh]����������������@������^�����������������������Xe�������x�������|p}؃�@��_�������؄� X���|p}x��@��_�D�!�������@��_���������p��8��p�����`�������x�����(����@��������h]E��������������*�F�h]I����������������R�h]U��������������(�b�`oS���������&p�����xie���������P�� 0�`oc���������&��� ��^G���������8��h������XeE�����c@�����������Ј����h]h��������������*�i�h]m���������������t��pj���������1`�����h]x��������������*�y�px����������������Xex�H��`�������������0�������|p}��@��_�،����������|p}���@��_�{�!�������@��_���������8��x�����(����@��������h]���������������*���h]�������������������p����������-x�����h]�������������������xi��������������l��������������(��`�������h]���������������*����l���������������������菒xi����������ؐ�/(0��p����������-P�����`o����������莒���`�����������ؙ�p�������|p}���@��_����������`���|p}���@��_����������@��_���������@��������h]ƕ������������@��ɕxiɕ�����������X�lɕ������������@��x��xiՕ��������0��00��pѕ��������-�����h]��������������@����xi�������������]^�����������������X������`o����������&������Xe����h]�������������@�� �xi ������������^ -�������������蘒�������`o ���������&���蘒Xe�0��hg•H�������������h����hg��0��p��������h]��������������@����xi�������������X�l��������������H�����xi����������8��80��p����������0Ț���h]��������������@����h]�������������������xi����������0�� Ol��������������ț������(��h]Ö������������8 �ʖh]͖�������������(�ږ`o˖��������&�������l������������������H�����`o����������&���h��`f�����`��������`��裒���`��x��h����|p}���@��_�H��h��������|p}(��@��_���n�������@��_���������袒 ���������঒Ч�h]��������������8 ���h]���������������(��^�����������袒 ���������`o����������&袒 ��Xe��X��h]�����������������xi���������h���l���������������8��Ф����h] �������������8 �'��l�����������������������xi-������������/@0��p)���������-(�����h]@�������������8 �G�p@����������������Xe>�@���h����hg�ȥ�����������h]V����������������X�xiX���������H�� OlX�������������঒�����Ч�h]_�������������8 �f��lY�����������������`�����`fO���hg��P����������HC x��h)� ����h]�����������������������ha�������x��h]������������������������v͌��������^�������������H���������Xe��������t͌�����"h)�x�����@��_����������͌0����"����Ȋ�(�������������(�� �����xix������P��X.�����X.��|p}��@��_�Э���������p��h���|p}���@��_�����������@��_���������H -����k�P� -��:-��� p��v�= ��&�(5��Ȱ����h��HC h��� ��������HC h��H -��������HC h��� -�������� Ȱ���h]������������������HC h�� ����X��8��б�h]������������������`f�����HC h��X.�����h]����������������豒����ha����0��h��h]����������������豒�����v����������^�����������������������Xe����貒�t������"X.�h��H���@��_�೒೒����� ��P��$����xi������H���z��赒�z��|p}Œ @��_�ȶ�趒8��!!�ϒ h������|p}���@��_�їD�������@��_���������xɒ���z��dH -����k�P� -���:-�� ����*��8���’��I� h��v�= ���&�(5��������������������@�����`’Ò�Ē�ƒ0Ȓ�ȒPϒ�͒ؿ��’�ĒhȒHC `��� ��������HC `��H -��������HC `��� -�������� ���֗h]җ���������������֗HC `�� ������� ���X���������Òxǒ�Вh]ޗ����������������غ����h]��������������������lޗ�������������������Ⱥ�Xeޗ0��h]�������������������xi������������X�l�����������������ػ�xi������������H0��p���������- ��`��xi�����������(2�`f�輒�h����hg�����0��H������`!�����н����h]%������������� �)�h],����������������0�xi0���������x���l0���������������H��ྒ��xi<���������0��P0��l1��������������������о�h]=����������������>�ha!����`��HC `�� �>�h]�����������������������^�������������@��H������Xe����x��`D�����(���ÒhasRoot]!�0����Ih]H�������������8��O�h]S����������������W�xi\���������’/X0��pX���������-������h]c��������������’d�haD�`’`��HC `��8��d�h]�����������������’����^�������������Ò ’����Xe����8Ò`j������Ò`ǒh]n����������������q�xiu���������XĒ`0�xit����������Ē��h0�h]u��������������ƒv�haj��Ē`��8���’��I� h��v�= ���&�(5@��ϒƸ‰����ƒz��dH -����k�P� -���:-�� ����*��Ќ��Ȓ���nHC `�����v�h]�����������������ƒ����^��������������ƒpĒ����Xe����ǒ`|������ǒXɒh]��������������Ќ���xi�����������Wh]���������������Ȓ��ha|�0Ȓ`��HC `��Ќ���h]�����������������Ȓ����^��������������ȒȒ����Xe����ɒ`��˒��|p} ˒@��_��˒̒ ̒ �̒�|p}�̒@��_�����������@��_���������HӒ�͒8В(ђ�ђPג�גxؒpْߒ8��p��8��h]��������������@���h]�������������������xi���������� ΒX�l���������������͒�͒xi�����������Βp0�`o����������'8ΒxΒ`������Hϒ�Вh]���������������ϒ��ha��PϒxɒHC `��@������ؿ��’�ĒhȒ�ϒh]�����������������ϒ����^�������������8В�Β����Xe����pВ�c�������Ғϒ�ђhҒh]���������������ϒ��xi�����������ђx0��p����������2(ђ`ђh]���������������ϒ˜p������������ђ����Xe�� Ғ`���������ҒXْ��xɒ�Ԓ��|p}�Ԓ@��_��Ւ�Ւ�Ւp֒�|p}�֒@��_�Ę��������@��_���������0��Pג�גxؒpْߒ8��p��8��h]̘���������������Иh]Ә���������������טxiט���������ג�lט�������������ג�גXؒxؒh]���������������ϒ���lؘ����������������ؒHؒ^ј��������Pג�ؒ����Xeْ̘h]�������������������xi�����������ْ/�0��p����������-pْ�ْ`��������xڒ8��HӒ�ܒ��|p}�ܒ@��_�`ݒ�ݒ�ݒ ޒ�|p}@ޒ@��_��W�������@��_���������0��ߒ8��p��h]��������������Ȓ��n���������5ߒ`���������ߒ������ڒ�����|p}���@��_����������X���|p}x��@��_� �O�������@��_���������8��p��h],��������������ƒ/�h]2��������������ϒ3�^0���������8��p������Xe,����f?��В�h����hg �8ߒhߒ(������`��������������HӒ�����|p}���@��_����������X���|p}x��@��_�]���������@��_���������8��h]���������������Ȓ��xi����������P�^����������8��p������Xe�����hg���ْ0ڒh�����������������������@�����`’Ò�Ē�ƒ0Ȓ�ȒPϒ�͒8В(ђ�ђPג�גxؒpْߒ8��p��8��@��H��0��h��@��x��h]Ù�������������ƒƙxi̙������������0�xi˙��������������0��pǙ��������-@�����h]ܙ�������������’��xi�������������`�xi�������������(2�rܙ��������H��������`fՙ���h����hg����P��h������p�����X���������Òxǒ�Вx������h]���������������’�h]��������������ƒ�xi �������������0��p���������-h�����`o���������0�����//] !�h����sxi������������p��`f�����h����hg��(�����������h]-����������������1�xi1������������ Ol1�������������@��x����0��x��xi8���������`���0�h];��������������ƒ>��l2����������������������`f&����HC `���z�����h]���������������� ������ha����h��`��h]���������������� �������v����������^�����������������������Xe���� ���t������"�z�`��@���@��_�����(���������&����xiJ� ��������i�� ���i��|p}�� @��_��� ���i�C<0� �������|p}���@��_�e�ԣ������@��_����������%��l�����v:�H -����k�P� -0��:-��H!P��S_���z��d� ���v�= h��&�(5h��������0��H�����(������������P�p���h�� �0 -�0����� �HC ���� ��������HC ���H -��������HC ���� -�������� ���j��0��o�h]f�������������h��j�h]l����������������o�HC ��� ����HC ����������h������(�8�� �藓h]{����������������~�h]���������������ٔ���p���������-H������n���������5���h]��������������������n����������8(��xi�������������`�p����������-`������n����������5���`o���������������h]��������������xٔš������xiÚ�������� ���s�hm���������������������s����������8��Xe������h����hgw�H������������h]������������������`���h]��������������h�����l�������������������P�Xe����`�����p� �h]�������������H! �xi������������0�h]�������������P��ha������HC ���H!�h]����������������P�����^���������������������Xe������`���������h]�����������������xi ������������0�xi���������8����0�h] �������������(�!�ha�P����P����*&{� -����v:�� ���v�= h��&�(5@�� �Ƹ‰H -����k�P� -0��:-��H!P��S_���(�z��dЌ� ����n�����F��� HC ������!�h]����������������(�����^�������������p������Xe������`'�����X���h]+�������������Ќ�7�xi:����������Wh]:������������� �>�ha'������HC ���Ќ�>�h]���������������� �����^�������������h�������Xe������`D�����P �h]H�������������@�I�h]H�������������� �I�haD�� ����HC ���@�H�h]T����������������W�h]\��������������ٔe����0��H�����(������������P�p���h�� �0 -�h -� �� �`���0�p�0�0�h�H�x����!��!��#�x$��pX���������-0 -�h -��nX���������5� �h]i����������������l�xil���������� �X�ll������������� �P �xiv��������� ��0��pt���������0� �� �`of���������� � �h]{����������������~�xi~����������X�l~�������������� �� �h]��������������h����xi������������X�l��������������`����p����������1 ���`ox���������` � �`���������������h#��g��i��������|p}�@��_�����`e�!���|p}��@��_���`�������@��_����������%�p�0�0�h�H�x����!��!��#�x$��b��b�Hc��c� d�h]�������������������xi������������X�l��������������p���h]��������������h����xi������������X�l��������������0�h��p����������-����h]�����������������Ûh]ț������������h��̛�pě��������-0�h�`o��������������xiݛ��������P��`f֛ ��h����hg����h�������`��������h]�������������������h]�������������������xi������������X�l��������������H���xi���������8��0�`o����������'���h]����������������ha����h�HC ����������0����� ���h�h]����������������������^�������������x�P�����Xe������` -�����`�X�h]�������������P���xi"������������0�xi!�������������0�h]"���������������#�ha -�0�h�HC ���P��#�h]����������������������^���������������������Xe�����h����|p} �@��_��� � �� ��|p}� �@��_�/�Š������@��_����������%��!��!��#�x$�h]0�������������� �1�h]4�������������h��8�xi8��������� "�X�l8��������������!��!�xiB����������"��0�`o@���������'8"�x"�^2����������!��"�����Xe0�#��c+�����%�P#�8$��$�h]E�������������� �F�xiJ��������� $��0��pG���������2�#��#�h]O�������������� �P�pO����������x$�����XeO��$�`��������X%��%��)�hb����`'���|p}�'�@��_�@(�`(�`a�!)��|p} )�@��_�R�Š������@��_���������8:� �@,�*��h*�X+��+��,��2��7��7�@>�D��D� E��F�L�PL�@M��R� ,�`\�����(*��,�h]b������������� �f�h]i�������������h��m�xim����������*��lm�������������h*��*�8+�X+�h]y�������������� �z��ln������������������*�(+�h]z�������������@,�{�ha\��+��%�HC �%� �{�^��������������+��+�����Xe�����,�h]��������������@,���xi����������X-�/�0��p����������-�,�(-�`���������-�@9��%�0���|p} 0�@��_��0�1� 1��1��|p}�1�@��_�����������@��_����������3��2��7��7�h]6������������� �B��n5���������5�2�`��������03�9�9�x.�85���|p}X5�@��_�6�86�X6��6��|p}�6�@��_�D��������@��_����������7��7�h]R�������������P�W�h]Z�������������� �[�xi^���������X8��0�`o\���������&�7�(8�^X����������7�p8�����XeR��8�fm�h#��h����hg1��2��2�09�����`���������9�XF�0a��%��;���|p}�;�@��_��<��<��<�`=��|p}�=�@��_�����������@��_���������H�@>�D��D� E��F�L�PL�@M��R�Y�8Y��^�`�P`�h]������������������xi�����������>�1�xi�����������>���1��p����������-@>��>�`���������?��D�0F�8:��A���|p}�A�@��_�xB��B��B�8C��|p}XC�@��_�����������@��_���������D��D� E�h]V������������� �b�xie���������P�^c���������D�PD�����XeV��D�h]x�����������������h]��������������� ���xi�����������E�1�`o����������& E�XE�^�����������D��E�����Xex��E��h����hg��?�H?�HF�����h]������������������xi�����������F�1��p����������2�F��F�`���������G��`�8:��I���|p}�I�@��_�xJ��J��J� 8K��|p}XK�@��_�����������@��_����������Z�L�PL�@M��R�Y�8Y��^�`�P`�h]��������������@,��h]���������������� -�xi -����������L��l -�������������PL��L� M�@M�h]�����������������l ������������������L�M��p���������-L�xM�`��������XN��Y�H�`P���|p}�P�@��_�@Q�`Q��Q�R��|p} R�@��_����������@��_����������T��R�Y�8Y�h]5���������������;�p5�����������R�����xiA����������S� 1�xi@����������S���(1��p<���������-S��S�`��������xT��Y��N��V���|p}�V�@��_�`W��W��W� X��|p}@X�@��_�D�ܟ������@��_���������Y�8Y�h]ğ������������(�ǟh]ʟ������������� �˟^ȟ��������Y�8Y�����XeğpY��h����hg/��S�0T��Y�����`��������`Z�`��`�H�h\���|p}�\�@��_�H]�h]��]�^��|p}(^�@��_�����������@��_����������^�`�P`�h]g���������������m�xiq���������P_�01�xip����������_���81�^n����������^�h_�����Xeg��_�h]��������������(���h]������������������^����������`�P`�����Xe���`�hg���M�N�Z������h����hg��G�HG� a�����h*�X+��+��,��2��7��7�@>�D��D� E��F�L�PL�@M��R�Y�8Y��^�`�P`�hg��p-��-�p9�����h]Ѡ������������P�֠h]۠������������(�ޠ�pנ��������-�b��b�h]��������������(���h]������������������^����������Hc��c�����Xe���c�h]�������������(��xi����������d�@1�xi����������d���H1��p���������- d��d�h]#�������������(�&�p�0�0�h�H�x����!��!��#�x$��b��b�Hc��c� d�(e�hf�h��h�(i�h])�������������h��-�xi-����������f�X�l-�������������hf��f�^'���������(e��f�����Xe#�(g��h����hg ��d�xg��g�����hg͠c�d��g�����h]C�������������h��G�xiG���������hh� OlG�������������h�8h��h��h�(i�h]N�������������P�S�h]U�������������(�X��lH������������������h��h�`f<�`i����0��H�����(������������P�p���h�� �0 -�h -� �� �`���0�p�0�0�h�H�x����!��!��#�x$��b��b�Hc��c� d�(e�hf�h��h�(i��t�u�w��w�(}�~���8��p�����Ȑ����Б�h������8��`��������0l��v����З����8n���|p}Xn�@��_�o�8o�p��!�o��|p}�o�@��_�f�У������@��_����������p��t�u�w��w�(}�~���8��p�����Ȑ����Б�h�������l�Hr���|p}hr�@��_�(s�Hs�hs� �s��|p}t�@��_�r�{�������@��_��������� y��t�u�w��w�(}�~���8��p�����Ȑ����Б�h]s�������������� �t�h]w�������������h��{�xi{���������hu�X�l{�������������u�8u�xi�����������u�P1�`o����������'�u��u�^u����������t�v�����Xes�Hv��cn�����Xx��v��w�@x�h]��������������� ���xi����������hw�X1��p����������2w�8w�h]��������������� ���p������������w�����Xe���w�`���������x�8���p��z���|p}�z�@��_��{��{��{� H|��|p}h|�@��_���{�������@��_������������(}�~���8��p�����Ȑ����Б�h]��������������h����xi�����������}��l��������������(}�`}��}�~�h]��������������� ����l�������������������}��}�xi�����������~�/`1��p����������-P~��~�`��������x���� y������|p}���@��_�`�������� ���|p}@��@��_�á��������@��_���������0����8��p��h]^������������� �j��n]���������5��`������������������������|p}؆�@��_�������؇�X���|p}x��@��_�l���������@��_���������8��p��h]z�������������P��h]��������������� ���xi����������؉�h1�`o����������&p�����^����������8���������Xez�0��f���v��h����hgY�8��h���������h]��������������(���xiĢ��������X��p1�xiâ�������������x1��p����������-���p��`��������@�������� y�H����|p}h��@��_�(��H��h��菓�|p}��@��_�Ǣs�������@��_���������Ȑ����Б�h]=������������� �I�xiL���������P�^J���������Ȑ�������Xe=�0��h]]�������������(�`�h]c�������������� �d�xig���������8���1�`oe���������&Б���^a������������P������Xe]�����h����hg���������������hg���~�0�������h]��������������(���xi����������Г��1�xi���������������1��p����������-h��蓓xi��������������`f��p���h����hg��0�����Д�����h]��������������h����xi����������x�� Ol����������������H�������8��h]��������������P�ãh]ţ������������(�ȣ�t�u�w��w�(}�~���8��p�����Ȑ����Б�h������8���l���������������������Е�`f��x��hgP�`����k�����HC ����i�����h]����������������������ha����`�����h]�����������������������vT���������^�����������������������Xe�������tT� ����"�i��������@��_����� ��T�P�����(����xiڣ����x���(�����(��|p}��� -@��_���������!x�� ��� ���|p}؝�@��_���N�������@��_����������������0�@��V�W!H -����k�P� -(��:-��83�P��bF:,���z��d� ���v�= (��&�(5(��������(��袓���������P��p��Ȫ�h��ج����@�����ഓ ��0�������HC ���� ��������HC ���H -��������HC ���� -�������� �����h]��������������(����HC ��� ����H�� -���С�(��8���������h]��������������� -���(��h] �������������(����l�����������������������Xe�`��`���������h]��������������0�"�xi&�������������1�xi%���������Т����1�h]&�������������@��'�ha�袓���HC ����0�'�h]����������������@������^�����������������������Xe�������`-�����p�� ��h]1�������������83�:�xi=���������ओ�1�h]=�������������P��>�ha-�������HC ���83�>�h]����������������P������^�����������������������Xe����Х�`D�����������h]H����������������K�xiO�������������1�xiN���������8�����1�h]O�������������(��P�haD�P�����83�P��bF:,�0�@��V�W!� ���v�= (��&�(5@����Ƹ‰ H -����k�P� -(��:-�����(��z��dЌ� �����nX;�0���Z�FHC ������P�h]����������������(������^�������������p��������Xe�������`V�����X�����h]Z�������������Ќ�f�xii����������Wh]i������������� ��m�haV�Ȫ����HC ���Ќ�m�h]���������������� ������^�������������h���������Xe�������`������P��H��h]��������������X;���xi��������������1�h]��������������0����ha��ج����HC ���X;��� �� ��0���������x��h]����������������0������^�����������������������Xe���������������|p}��@��_�а����������|p}���@��_��Ө������@��_���������������ഓе����h] �������������@� �h]�������������(���xi�����������X�l����������������ಓxi�������������1�`o���������'(��h��`�����8��h��h]�����������������ha�@��h��HC ���@��h]�����������������������^�������������ഓ�������Xe�������c�����(�����P����h] ����������������!�xi%���������8���1��p"���������2е���h]*����������������+�p*�����������������Xe*�ȶ�`��������p���������˓�ӓ`�����x����|p}���@��_�X��x���ݓ!���|p}8��@��_�-�Ө������@��_������������ �X��*�����p�������ē�ɓʓ�˓�ѓ�ғ�ғ(ԓ�ٓ�ړ�ړ�ۓ8��`5�����@�����h];������������� �?�h]B�������������(��F�xiF���������輓�lF�������������������P��p��h]R����������������S��lG�������������������@��h]S�������������X��T�ha5������HC ��� �T�^����������������������Xe�������h]`�������������X��d�xii���������p��/�1��pe���������-��@��`����������X˓�˓���“��|p}8“@��_��“Ó8Ó�Ó�|p}�Ó@��_�r�h�������@��_����������œ�ē�ɓʓh]������������� ����n���������5�ē`��������Hœ˓0˓���PǓ��|p}pǓ@��_�0ȓPȓpȓ�ȓ�|p}ɓ@��_��N�������@��_����������ɓʓh]!�������������P��*�h]-����������������.�xi1���������pʓ�1�`o/���������&ʓ@ʓ^+����������ɓ�ʓ����Xe!��ʓf>�����h����hg��ēœH˓�����eW�����h����hg\����ȿ��˓����h]s�������������(��v�xi|���������H̓�1�xi{����������̓���1��pw���������-�˓`̓`��������0͓pғ�ӓ���8ϓ��|p}Xϓ@��_�Г8ГXГ�Г�|p}�Г@��_���������@��_����������ѓ�ғ�ғh]�������������� ����xi����������P�^�����������ѓ�ѓ����Xe�� ғh]�������������(�� �h]�����������������xi���������(ӓ�1�`o���������&�ғ�ғ^ ����������ғ@ӓ����Xe��ӓ�h����hgo��̓�̓�ӓ����h]'�������������X��+�xi0����������ԓ.2��p,���������-(ԓ`ԓ`��������0Փ�ݓ���8ד��|p}Xד@��_�ؓ8ؓXؓ�ؓ�|p}�ؓ@��_�9��������@��_����������ٓ�ړ�ړ�ۓ�ܓh]��������������@����xi���������� ړ2�xi����������hړ��2��p����������-�ٓ8ړh]��������������@����h]�������������������^�����������ړ�ړ����Xe��0ۓh]̧������������0��קxiܧ��������ܓ2��pا��������-�ۓ�ۓ�nا��������5ܓh]��������������0����xi�����������ܓ 2�^�����������ܓ�ܓ����Xe��ݓ�h����hgȧXܓXݓpݓ����hg���ړ�ۓ�ݓ�������p�������ē�ɓʓ�˓�ѓ�ғ�ғ(ԓ�ٓ�ړ�ړ�ۓ�ܓ�ޓ���h] �������������@���xi���������Pߓ(2�xi����������ߓ��02��p���������-�ޓhߓ�n���������5�ߓ`��������h�������p����|p}���@��_�P��p��������|p}0��@��_��ͨ������@��_������������h]��������������0����xiè��������X��82�xi¨�������������@2�^�������������p������Xe������h����hg��ߓ �� ������hg#��ԓ�ԓ0������������(��袓���������P��p��Ȫ�h��ج����@�����ഓе���������������������� ��X�����������h]ݨ������������@����xi������������H2�xi����������H����P2��p����������-�����h]��������������(����xi�����������X2�xi���������P����`2��p����������-��� ��`o����������`��h��h]O�������������0��Z�xi_���������P��h2��p[���������-��� ��`o������������h��h]��������������0����xi����������P��p2��p����������-��� ��h]Ω������������@��֩h]۩������������(��ީxi����������H��x2�`oߩ��������'������pש��������-���`��`o©��������h�����h]��������������@����h]��������������P���xi�������������2�`o���������&X������p����������- �����`o���������������`oa������������X��`�������� ��������(����|p}H��@��_���(��H������|p}���@��_� �$�������@��_���������xi�������������`f�����h����hg٨������������������С�(��8��������������h]0�������������(��4�xi4���������8�� Ol4���������������������������h];�������������@��C�h]E�������������(��H��l5�����������������P�����`f)�0��HC ����(�����h]�����������������������ha����������h]������������������������v����������^�������������@��x������Xe��������t������"�(����p���@��_������������H����*����xiT����������������|p}���@��_����������@�� ��� ��|p}`��@��_�k�Z�������@��_����������H -h���k�P� -���:-���  ��v�= 8����������x��H����� ��� -�p �� �HC ��� ��������HC ��H -��������HC ��� -��������8�x��v�h]l����������������v�HC ��8�������h �� -� �h]�������������������xi�������������p����������-H�����h]��������������������n����������8���xi����������������p����������-(�X��n����������5��`o���������������`����������h -�������|p}��@��_�������@��|p}`�@��_���1�������@��_��������� ��h]˪������������xٔԪh�� ����@�ު��x�����H�xiު����������h��xiު����������h��h]���������������� ��n���������8�xi ������������xi ������������ �H�n����������� �`oު��������&�� �`o���������&` �x�hmǪ�������� �X������s����������� �Xe��8 -��h����hg~��P�� -�����h]=���������������D� �( �p �xiE���������X �`�h]J����������������T��l=������������������ -�� -�`f6�� �HC ��������h]���������������� �����ha����` ���h]���������������� ������v\���������^�������������� �� �����Xe���� ��t\�����"��������@��_��� �\����� �,����Ȋ�(�������������(�� ����� ��ǔ�Ȕ�ɔ@ʔ�ʔxi`��������������|p}�@� @��_�����p���dHF� 0�pƔ�|p}p�@��_�u�`� - ������@��_���������p�����������E�n�H -x��k�P� -��:-�� �� �*��� 0�v�= ��&�(5����X���P���������� � !�H"�#�(%�P&��&��+���� �@#��&�HC (�� ��������HC (�H -��������HC (�� -�������� ��z�h]v���������������z�HC (� �����Ĕ#P�h�8�h��!��%�5�h]����������������������h]�������������������l������������������X���Xe����`��������x�h]�������������������� ��h� ���xi����������P���xi������������� �h���������xi�������������xi����������P���� ���������xi������������p�xi������������������������xi«��������x��xiǫ�����������H�����������xi˫��������0�h�xiѫ��������x���H�����������h� ����� j����������������h]ԫ��������������իha��P�(�HC (���իh]����������������������^��������������������Xe����(�h]߫����������������xi������������X�l������������������xi�������������2��p����������-�P�h]�����������������`f�����h����hg۫���(�����`��������!�h] ������������� ��h]����������������xi���������X��l���������������(�����xi#��������� ��2��l�����������������p���h]$�������������� �%�ha�� �(�HC (� �%�h]����������������� �����^������������� !�( �����Xe����X!�`+�����"��%�h]/��������������E9�h]=�������������� �A�xiF����������"�/�2��pB���������-H"��"�h]M��������������$�N�ha+�#�(�Ќ��=����n @�Ƹ‰ 83��9�bF:, ���������E�$��n�� 0�v�= ��&�(5H -x��k�P� -��:-�� �� �*��H!�&��S_�0��6�V�W!����;�z��d -HC (��EN�h]�����������������$�����^�������������(%��"�����Xe����`%�`T�����&�h]X�������������H!]�h]X��������������&�]�haT�P&�(�HC (�H!X�h]g��������������$�q�`��������p'�P-�8.�(�x)���|p}�)�@��_�X*�x*��*�+��|p}8+�@��_�s���������@��_����������+�h-�h]{���������������~�xi~���������`,���l~��������������+�0,�xi�����������,�`�^����������x,��,�����Xe{�-�h]���������������&���xi�����������-��2�^����������h-��-�����Xe���-���X���P���������� � !�H"�#�(%�P&��&��+�h-�(4�X6�@7�89��9��;�0<��=�(>�P?��@�8D��E��F��K�L�`���������/��4�(��1���|p}�1�@��_��2��2��2�H3��|p}h3�@��_�����������@��_���������(4�h]���������������&���xi�����������4��2�^����������(4�`4�����Xe���4�hgc��&�('�X/�����`Ĭ�����5��7�h]Ȭ�������������0�ЬxiԬ���������5��2�xiӬ��������@6����2�h]Ԭ�������������6�լhaĬX6�(�HC (��0�լ��� �@#��&��6�p9��;��=��@�h]�����������������6�����^�������������@7�6�����Xe����x7�P�h�8�h��!��%�5�@5�h8�x:��<��>��D��K���XĔ`۬�����8�`:�h]߬������������83���xi���������� 9��2�h]���������������9���ha۬89�(�HC (�83���h]�����������������9�����^��������������9��8�����Xe����:�`�������:��<�h]�������������������xi����������0;��2�xi����������x;����2�h]���������������;���ha���;�(�HC (������h]�����������������;�����^�������������0<�H;�����Xe����h<�`�����=��>�h]�������������Ќ��xi����������Wh]��������������=��ha��=�(�HC (�Ќ��h]�����������������=�����^�������������(>�X=�����Xe����`>�`!�����?��D�h]%�������������@�&�h])���������������-�xi-����������?�X�l-�������������P?��?�xi7���������@@��2�`o5���������'�?�@�h]7��������������C�8�ha!��@�(�83��9�bF:, @��C�Ƹ‰ ��&�(5 �� �*��Ќ��=����n ���������E�$��n�� 0�v�= �0��6�V�W!H -x��k�P� -��:-��H!�&��S_����;�z��d -X;�F��Z�F HC (�@�8�h]�����������������C�����^�������������8D�X@�����Xe����pD�`������ E�hG�h]��������������X;�ĭxiǭ���������E��2�h]ǭ������������F�ȭha���E�(�HC (�X;� ȭpƔ��� �@#��&��6�p9��;��=��@��E�h]����������������F�����^��������������F�`E�����Xe����G�(�I���|p}0I�@��_��I�J��{�!�J��|p}�J�@��_�����������@��_����������M��K�L��L��Q�0R� S�T��Y��^�_��`��f��g��g�8i��n��c������(M�PL�M�h]���������������C���h]���������������&����p����������2�K�L�h]���������������C���p������������L�����Xe���L�`��������pM�T��`�i�p{��G�xO���|p}�O�@��_�XP�xP��r�!Q��|p}8Q�@��_�����������@��_����������u��Q�0R� S�T��Y��^�_��`��f��g��g�8i��n��o�p��p�h]�������������� � �h]����������������xi����������R��l�������������0R�hR�S� S�h]��������������C���l������������������R��R�^ ����������Q�XS�����Xe��S�h],�������������� �0�xi5����������T�/�2��p1���������-T�PT�`�������� U�h`��`��M�(W���|p}HW�@��_�X�(X�HX��X��|p}�X�@��_�>�4�������@��_����������Z��Y��^�_�h]Ӯ�������������=�߮�nҮ��������5�Y�`��������XZ�(`�@`��U�`\���|p}�\�@��_�@]�`]��]�^��|p} ^�@��_����������@��_����������^�_�h]���������������9���h]���������������C���xi�����������_��2�`o����������&_�P_�^�����������^��_�����Xe���_�f -��K��h����hgή�Y�Z�X`������e#��K��h����hg(��T��T��`�����h]?��������������;�B�xiH���������Xa��2�xiG����������a���3��pC���������-�`�pa�`��������@b��g��h��M�Hd���|p}hd�@��_�(e�He�he��e��|p}f�@��_�K���������@��_����������f��g��g�h]���������������=�¯xiů��������P�^ï���������f�g�����Xe��0g�h]ԯ�������������;�ׯh]گ�������������C�ۯxiޯ��������8h�3�`oܯ��������&�g�h�^د���������g�Ph�����Xeԯ�h��h����hg;��a��a��h�����h]��������������� ���xi�����������i�.3��p����������-8i�pi�`��������@j��r��M�Hl���|p}hl�@��_�(m�Hm�hm��m��|p}n�@��_��Ͱ������@��_����������n��o�p��p��q�h]^��������������6�f�xil���������0o�3�xik���������xo��� 3��pg���������-�n�Ho�h]y��������������6���h]���������������C���^�����������o�p�����Xey�@p�h]��������������F���xi����������q�(3��p����������-�p��p��n����������5(q�h]��������������F���xið��������r�03�^�����������q��q�����Xe��r��h����hg��hq�hr��r�����hgZ��o��p��r������Q�0R� S�T��Y��^�_��`��f��g��g�8i��n��o�p��p��q��s�z�h]װ�������������6�߰xi����������`t�83�xi�����������t���@3��p����������-�s�xt��n����������5�t�`��������xu�{��M��w���|p}�w�@��_�`x��x��x� y��|p}@y�@��_�����������@��_���������z�h]��������������F���xi����������hz�H3�xi�����������z���P3�^����������z��z�����Xe���z��h����hgӰu�0u�0{�����hg���i��i�@{������K�L��L��Q�0R� S�T��Y��^�_��`��f��g��g�8i��n��o�p��p��q��s�z���X���P���������� � !�H"�#�(%�P&��&��+�h-�(4�X6�@7�89��9��;�0<��=�(>�P?��@�8D��E��F��K�L��L��Q�0R� S�T��Y��^�_��`��f��g��g�8i��n��o�p��p��q��s�z��~�������Ђ���H�����Њ�ؐ������В����h]���������������6���xi����������(�X3�xi����������p���`3��p����������-�~�@�h]ı�������������;�DZxiͱ��������0��h3�xi̱��������x����p3��pȱ��������-��H��`o���������������h]�������������F�&�xi+���������x��x3��p'���������-��H��`oϱ��������Ѐ����h]|�������������F���xi����������x���3��p����������-��H��h]���������������6���h]���������������;���xi����������p���3�`o����������'��@���p����������-Ђ����`o�������������ȃ�h]���������������6�òh]Ȳ�������������9�ѲxiԲ��������脔�3�`oҲ��������&�������pIJ��������-H����`o������������@��`o-���������Ё����`��������H��@��(�P����|p}p��@��_�0��P��p�� ����|p}��@��_�ز��������@��_���������Ќ�Њ�ؐ������В����Ȕ���Ж����������h]���������������;���xi����������8���3�xi����������������3��p����������-Њ�P���n����������5���`��������P����Ȇ�X����|p}x��@��_�8��X��x�� ����|p}��@��_�����������@��_���������ؐ������В����Ȕ���Ж����������h]���������������9��xi ���������@���3��p���������-ؐ���h]��������������$��`o���������X�����h]'���������������*�xi*���������x��p�l*���������������H��h]2���������������5�xi5���������8��h�l5�������������В���h]=���������������A�xiA������������ OlA����������������ȓ�`�����Ȕ�xiH�������������3�h]K��������������;�N��lB�������������������P��^;���������P��������^0������������X������Xe'����h]h���������������k�xik���������x��p�lk���������������H��h]s���������������v�xiv���������8��h�lv�������������Ж���h]~�����������������xi������������� Ol�����������������ȗ�`��������h]���������������9���h]���������������;����l��������������������P��^|���������P���������^q������������H������Xeh����hg��Б����虔�����h����hg��؋���0��������X���P���������� � !�H"�#�(%�P&��&��+�h-�(4�X6�@7�89��9��;�0<��=�(>�P?��@�8D��E��F��K�L��L��Q�0R� S�T��Y��^�_��`��f��g��g�8i��n��o�p��p��q��s�z��~�������Ђ���H�����Њ�ؐ������В����Ȕ���Ж����������x��8�����@��x��p��0��h��0�����ൔ����з������� ��軔ؼ���8�����������p”�”�Ĕ`�����������������(������|p}��@��_�ء����X��!����|p}���@��_���״������@��_���������(��x��8�����@��x��p��0��h��0�����ൔ����з�������h]���������������9�³xidz��������ࣔ�3��pó��������-x�����h]̳�������������$�ֳ`oɳ�����������8��`�����������X��H��p������|p} ��@��_�৔�� ������|p}���@��_�س4�������@��_������������@��x��p��0��h��h]������������������xi����������詔h�l��������������������h]������������������xi������������� Ol��������������@��x����0��x��xi����������`���3�h]���������������6���l�����������������������^�������������������Xe����h]����������������xi���������ج�p�l�������������p�����h]����������������xi������������ Ol�������������0��h���� ��h��xi$���������P���3�h]'��������������;�*��l�����������������������^�������������������Xe����`��������������ع�p�������|p}б�@��_�������в�P���|p}p��@��_�:���������@��_���������0�����ൔ����з�������h]D���������������G�xiG������������h�lG�������������0��h��h]O���������������S�xiS���������X�� OlS����������������(�����ൔ��h]Z��������������9�c�h]e��������������6�m��lT�����������������p�����^M������������P������XeD����h]x���������������{�xi{���������x��p�l{���������������H��h]������������������xi����������8�� Ol��������������з������������h]���������������9���h]���������������;����l������������������P�����^�������������0������Xex����hg��p�����`������h]������������������x��8�����@��x��p��0��h��0�����ൔ����з������� ��軔ؼ���xi��������������l�������������� ��`��h]������������������xi����������P�� Ol��������������軔 �����ؼ���h]´�������������6�ʴh]̴�������������;�ϴ�l������������������h�����^�������������H������Xe�����hg��������������h]���������������9���xi��������������3��p����������08��p��h]������������������xi����������`����l�����������������0��h]����������������xi��������� �� Ol�������������������������p��xi �������������3�h]��������������9��xi���������X���3�`o���������'���(���l�����������������8��x��^����������x���������Xe��”h]+��������������$�5�h]=���������������@�xi@���������Ô��l@��������������”�”xiG����������Ô`�^E���������(ÔhÔ����Xe=��Ô�h����hg'�p”ĔĔ����hgݴ���X”(Ĕ����h]X���������������[�`fQ��Ĕ@ǔP�h�8�h��!��%�5�@5�h8�x:��<��>��D��K���XĔ�ĔHC (��� -����h]�����������������Ŕ����ha����8Ɣ(�h]�����������������Ŕ�����vg���������^��������������Ɣ�Ɣ����Xe�����Ɣ�tg�����"��(���@��_��ǔ�ǔ�ǔg���Xǔ.����xif�����PȔ��xik� �����Ȕ`� ȔhȔ��������xir�#����ɔ�5�:](!� ɔV�~�xi}�&�����ɔ(ɔ�ȔXɔ��������xi��)�����ɔ��xi��,�������ɔʔ��������xi��/�����ʔ�7�xi��2������hʔ�ʔ�������� j5������4�@:�����h]������������˔��ha'�X˔�HC ��7� -��^����������X˔˔����Xe�����˔h]��?���������˔��xi��<�����̔��l��9��������`̔�̔h]��L��������9���xi��I�����͔��l��F�������� ͔X͔h]��O��������9�ŵ^��B�����͔�͔0^��5�����̔Δ2Xe��hΔh]ǵ\���������˔̵�  � ��ph�|h�P��8�X˔`̔ ͔�͔�Δ�ДXєHҔ�Ӕ�Ԕ(Ք�Քxi̵Y����@Д�7�l̵V���������ΔДh]յi��������9�ڵxiڵf����є�7�lڵc���������Д�Дh]��l���������˔��^��_����єXє4^ӵR����XД�є6Xeǵ�єh]��{����80ٔ��platform]0!��Ҕ�-��xi��x�����Ҕ�Ҕl��u����:HҔ�Ҕxi�~����pӔ���p�r����-Ӕ@Ӕh]����������h�xi������0Ԕ� l�����������ӔԔh]!����������9�&�^������HԔ�Ԕ�������Ք�Ք>Xe/� ֔hg���ӔՔp֔o�t ����d����@��_����0��0��Xe�ؔ�t���������� �@��_�ؔؔؔ����HC �� ����h]���� ��������ؔ����^��������Xؔ�֔����h]K���������ؔ����`fK��ؔHC ���������HC �(���������HC �H ���������P�.this_function]�3�Hڔ�s�p"p����x���8�8������ �# -���`�����(�h�(�P�`�`� � -`��������� �@�0}�X��� �p���`� X<�> �A -@D xI �a d�}��9�@:��:��;��>�B��F��H�J�b� e� -(�� (� HL��L��L��M� Q��U�����z�8{��{������@��`��@��ؤ�0�� �-�0.�x.� 0�h0�7�<�XF��V��i� l� -h|� H�� p�� @��蝀������P��p3��3�4�5��@��I� �h���������x������������� ��� -��� @@� Ї�H��� �0n�xn��n��o�@p�0w�{�}��~���� ��� -�M�-�X-��-��.��1�@4�8�:�`<��C� ���Ѝ��������Ȥ�����0����� ��x��p��hԃ hփ -蟐 ��� P�� ੐������>�?�P?��A��C�PE�PM��V�@�����Џ�А�X�������讑0��0����X��������Ƒhϑ�����H�������������( �8 �h� ( � -P#� �(� �*� hn��r�@��p���������h���������������’�ƒ�Ȓ�ϒ@,�������0��h�����P�(� �� ��� �� -X��������(��(��@��P��(�� ��0����� ��h��������0�x�������� ��$��&��6��9� �;� -�=� �C� F� � x - � h0x��� p| -�� �� 9� �˔0ٔxٔ�ٔ� h0x��� p| -�� �� 9� �˔ؔ0ٔxٔ�ٔ diff --git a/Chapter03/working-with-files/asynchronous-file-operations/file.dat b/Chapter03/working-with-files/asynchronous-file-operations/file.dat deleted file mode 100644 index 70f7303fa96ddbe5c09d635e04ad08ef6c1a1838..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1090435 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 zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs T0RjXF5FkK+0D)gFf!F>YQrO$! diff --git a/Chapter03/working-with-files/asynchronous-file-operations/log.txt b/Chapter03/working-with-files/asynchronous-file-operations/log.txt deleted file mode 100644 index 18bed12..0000000 --- a/Chapter03/working-with-files/asynchronous-file-operations/log.txt +++ /dev/null @@ -1,22 +0,0 @@ -Wed Jun 08 2016 22:53:26 GMT+0100 (BST) 896961 bytes removed -Wed Jun 08 2016 22:54:14 GMT+0100 (BST) 896961 bytes removed -Wed Jun 08 2016 22:54:25 GMT+0100 (BST) 896961 bytes removed -Wed Jun 08 2016 22:54:30 GMT+0100 (BST) 896961 bytes removed -Wed Jun 08 2016 22:54:36 GMT+0100 (BST) 896961 bytes removed -Wed Jun 08 2016 22:54:41 GMT+0100 (BST) 896961 bytes removed -Wed Jun 08 2016 22:54:59 GMT+0100 (BST) 10000000 bytes removed -Wed Jun 08 2016 22:56:01 GMT+0100 (BST) 100000000 bytes removed -Wed Jun 08 2016 22:57:07 GMT+0100 (BST) 897494 bytes removed -Wed Jun 08 2016 22:57:23 GMT+0100 (BST) 10000000 bytes removed -Wed Jun 08 2016 22:57:32 GMT+0100 (BST) 897432 bytes removed -Wed Jun 08 2016 22:57:34 GMT+0100 (BST) 897432 bytes removed -Wed Jun 08 2016 22:57:35 GMT+0100 (BST) 897432 bytes removed -Wed Jun 08 2016 22:58:21 GMT+0100 (BST) 897432 bytes removed -Wed Jun 08 2016 22:59:03 GMT+0100 (BST) 897432 bytes removed -Wed Jun 08 2016 23:03:21 GMT+0100 (BST) 897432 bytes removed -Wed Jun 08 2016 23:03:56 GMT+0100 (BST) 897432 bytes removed -Wed Jun 08 2016 23:04:14 GMT+0100 (BST) 897432 bytes removed -Wed Jun 08 2016 23:04:40 GMT+0100 (BST) 897432 bytes removed -Wed Jun 08 2016 23:04:45 GMT+0100 (BST) 897432 bytes removed -Wed Jun 08 2016 23:50:48 GMT+0100 (BST) 897432 bytes removed -Wed Jun 08 2016 23:50:50 GMT+0100 (BST) 897432 bytes removed diff --git a/Chapter03/working-with-files/asynchronous-file-operations/null-byte-remover-sync-with-progress-dots.js b/Chapter03/working-with-files/asynchronous-file-operations/null-byte-remover-sync-with-progress-dots.js deleted file mode 100644 index cb9dea7..0000000 --- a/Chapter03/working-with-files/asynchronous-file-operations/null-byte-remover-sync-with-progress-dots.js +++ /dev/null @@ -1,16 +0,0 @@ -'use strict' - -setInterval(() => process.stdout.write('.'), 10).unref() - -const fs = require('fs') -const path = require('path') -const cwd = process.cwd() -const bytes = fs.readFileSync(path.join(cwd, 'file.dat')) - -const clean = bytes.filter(n => n) -fs.writeFileSync(path.join(cwd, 'clean.dat'), clean) - -fs.appendFileSync( - path.join(cwd, 'log.txt'), - (new Date) + ' ' + (bytes.length - clean.length) + ' bytes removed\n' -) \ No newline at end of file diff --git a/Chapter03/working-with-files/asynchronous-file-operations/null-byte-remover.js b/Chapter03/working-with-files/asynchronous-file-operations/null-byte-remover.js deleted file mode 100644 index 9ffea92..0000000 --- a/Chapter03/working-with-files/asynchronous-file-operations/null-byte-remover.js +++ /dev/null @@ -1,19 +0,0 @@ -'use strict' - -setInterval(() => process.stdout.write('.'), 10).unref() - -const fs = require('fs') -const path = require('path') -const cwd = process.cwd() - -fs.readFile(path.join(cwd, 'file.dat'), (err, bytes) => { - if (err) { console.error(err); process.exit(1); } - const clean = bytes.filter(n => n) - fs.writeFile(path.join(cwd, 'clean.dat'), clean, (err) => { - if (err) { console.error(err); process.exit(1); } - fs.appendFile( - path.join(cwd, 'log.txt'), - (new Date) + ' ' + (bytes.length - clean.length) + ' bytes removed\n' - ) - }) -}) diff --git a/Chapter03/working-with-files/clean.dat b/Chapter03/working-with-files/clean.dat deleted file mode 100644 index c0c38c9..0000000 --- a/Chapter03/working-with-files/clean.dat +++ /dev/null @@ -1,189 +0,0 @@ -��b�6�d�����%�%����h]k�������������0��2���|p}82@��_��23xc!�3�|p}�3@��_��v�y3��������`@��_�����������9(2h]{�������������|�ha@2  ��|������������������2����^�������������4�4�6�=�>(D`DXFG�LxR8S�S�VW�Wp}05���_�606�6p}�6���_�����h]w������������x��wh] w�������������� wxi w��������85�`�l w�������������45�5�5xiw���������58 �lw����������������P5�5A^w���������46����Xew`6h])w��������������-wxi-w��������07�`�l-w�������������67�7�7`�7xi9w���������7����@ �l.w����������������H7�7�xi@w���������8:H �pHcX �"�0x2�8�Bh]�����������������00;���|p}P;@��_�<0<@b!�<�|p}�<@��_�Iw�y$����`@��_��������������Y���������8p����������� ;Xe��`���������@�D�F�=�>(D`DXFG�LxR8S�S�VW�W�]�^`_�>?(?�|�?��h]Uw��������_���� ��\wxi_w��������>P ^]w���������=�=����XeUw0>h]pw���������������swxivw��������?X �ptw��������0�>�>`���������?@F�X�9�A���|p}�A@��_��B�B�B HC�|p}hC@��_�ywy]����`@��_���������������H��l���������������A������(B�@�����������Ah]���������������B��ha��(D`DXFG�LxR8S�S�VW�Wh]�����������������B����^�������������@B����XeXCh]�����0�������������8h]�w�������������x���wh]�w���������������w����xi�w���������D�`�l�w������������`D�D0EPE�2��h]xi�w���������E����` �l�w������������������D E����^�w������������(D�E����Xe�w�Eh]�w������������x���wxi�w���������F/h �p�w��������-XF�Fh]�w������������x���wxi�w���������G\p �p�w��������-GPG`o�w���������F�G`��������`H��V�W�X�H���l������������� HXH @hJ���|p}�J@��_�HKhK�KL�|p}(L@��_��wy}����`@��_�L��������pN�Mp} M���_�#�������@����_������Q�LxR8S�S�VW�W�k�P� -�pN:-������OR�q � ��Mv�= �OV�q$�O�O8O�P�UXW@X�Yh]�w����������������wxi�w��������PMx �p�w��������-�L M`���������MC pV�V��������HC �IH -����������H�O���|p}P@��_��P�PQ�Q�|p}�Q@��_��w�xO����`@��_����������I��HP�Y�Zh]�����O;���������Q�V�WxR8S�S�V�IS���|0S�S�T�|p}���_�h]wx������������0��zxxizx����������R�����H�lzx������������xR�Rh]�x������������0���xxi�x���������S�G�l�x������������8SpSh]�x���������������xxi�x��������`T ��l�x�������������S0T�T�T0Uxi�x��������U� xi�x��������`U� �l�x����������������xT�Ti^�x���������SxU��������^�x���������R�U����Xewx Vh]�x�������������0���x`f�x�V�h����hg�whM�M�V��������h]�x������������p���xxi�x�����������ł^�x��������WPW����Xe�x�Wh]�x������������� ��yxiy��������PX� ^y���������W X����Xe�xhX�h����hg�w�GH�X��������`��������XY�a(bY�Y����`o����������&�XYXet��9`[���|p}�[@��_�@\`\�\]�|p} ]@��_�%y�y�����`@��_������������������������G�G��X[����������xi������������l���������������[\�]�^`_�a�������������p����������-H\�\�n�����������\h]��������� p"�%h0@2�8�Bh]�y������������0���yxi�y��������H^�H�l�y�������������]^h]�y������������0���yxi�y��������_�G�l�y�������������^�^h]�y���������������yxi�y����������_ ��l�y������������`_�_0`P`�`^������xi�y���������`� xi�y���������`� �l�y�����������������_ `�� ^�y�������� _�`�����^�y��������`^8a����Xe�y�ah]�y������������0���y� `f�y�a�=�>(D`DXFG�LxR8S�S�VW�W�]�^`_�a�����b��l��� ������b�bxihglw?X?Y�����4�4�6�=�>(D`DXFG�LxR8S�S�VW�W�]�^`_�a����0d��l�� ������cd�h����hg%w�8�8�d����8��������������������p�����������������`������������������8�������������������������(��������������8��p��(�`�`��� �x�������X�����0�h��@������,�x-�x.�8/��4�4�6�=�>(D`DXFG�LxR8S�S�VW�W�]�^`_�al@� ������f�fxiJ� �����g���lJ�� �����@g�g^4�� �����f�g�Xe�hh]x� ������������xi�� �����h��l�h����hgsv�80�x0��h����royShg�p������i����إ������ج�x����`��x��8��ر�H��h����� ����������������8��������������������p�����������������`������������������8�������������������������(��������������8��p��(�`�`��� �x�������X�إ������ج�x����`��x��8��ر�H��h����� ����������������8��������������������p�����������������`������������������8�������������������������(��������������8��p��(�`�`��� �x�������X�����0�h��@������,�x-�x.�8/��4�4�6�=�>(D`DXFG�LxR8S�S�VW�W�]�^`_�a�oxpHvw�w@y�zH{|@}�0���@���0���(�P���8���H�H�����`�������@��H���X�0�h]z������������x�� zxiz������������ p/� �p -z��������-�o�oh]z������������x��zxi"z���������p\� �pz��������-xp�p`oz��������8p�p`���������q�(yxy����HC �kp܀����x���s���|p}�s@��_��t�t�thu�|p}�u@��_�+z�z�������`@��_���������h]����������������h]�����q�������������o��`��h]����������Hvw�w@y]�u�5Ouh]���������������o���D����������r�Dh]����������������h]����h]�z������������0���zxi�z���������v�H�l�z������������Hv�vh]�z������������0���z����xi�z��������pw�G�l�z������������w@wh]�z����������������zxi�z����������0x� l�z��������������wx^�z���������wHx����^�z���������v�x����Xe�z�xh]�z������������0���z`f�z@y�h����hgzQ 8qxq�y����hg�p(��h���y����������������x����`���yH~x~Ѐ��ЈȊ؍��h]�z������������� ���zxi�z�����������z� �p�z��������0�z�zh]�z������������0���zxi�z���������{�H�l�z������������H{�{h]�z���������������zxi�z��������p|l ��l�z�������������|@|�|�|@}�|xi�z��������(}����� h]�z������������ ��{Z �l�z�����������������|�|^�z���������{x}����Xe�z�}�h����hg�z{ ~8~����` {�����~� ��h]{�������������0�{xi{���������0y � xi{��������x��� h]{�������������{ha {�x��HC x���0�{h]���������������������^�������������0�H����Xe�����h�`"{�����ȅh]&{�������������83�/{xi2{������������ h]2{��������������3{ha"{��x��0�x�Є@�83���bF:, ��X�0�h�Ȝ� ���&�(5@Y���Ƹ‰��� �����K T�x��*���~�h��n�0 Ќ������np� ���������ب����2�~�pH -����������0��V�W! ��0������� ����v�= ���p���n�H -�Ȥ��k�P� -���:-��(тh���`� -���P�z��d X;���Z�F��������HC x��83�3{h]����������������������^�������������@�X�����Xe��������x�`9{����(���h]={���������������@{xiD{����������� xiC{������������� h]D{������������P�E{ha9{��x��HC x����� E{P��p�����X��P��H��H���؁0���Ќ��h]����������������P�����^�������������0�������Xe����h�`K{�����-����h]O{������������Ќ�[{xi^{���������łh]^{��������������b{haK{��x��HC x��Ќ� -b{h]����������������������^�������������(�X�����Xe����`�`h{�������h]l{������������@Y�m{h]p{��������������t{xit{����������X[�lt{������������P���xi~{��������@�� `o|{��������'Ћ�h]~{��������������{hah{��x��HC x��@Y� {h]����������������������^�������������8�X�����Xe����p�`�{���� �Џh]|������������X;� |xi|���������� -h]|�������������|ha�{��x��HC x��X;� |h]���������������������^�����������������H�`�����Xe��������������x��x����|p}��@��_�X�x��!��|p}8�@��_�2|�����`@��_���������X�p}����x��|p}���_�a�������H�����`�������@��H���X�0��8����c.|��������x�h]5|��������������6|h]:|������������ ��A|�p7|��������2H���h]E|��������������F|pE|���������������XeE|0�`������������ؕ^h�(�p���������Xei�ȕh]���������������������|p}�@��_�����X�!���|p}��@��_�H|�����`@��_���������-`�p�`@�����H����|p}h�`�������@��H���X�0��8���0�8�p��|p}����_���������@����_�����h]P|������������x��T|h]W|��������������[|xi[|����������`�l[|��������������Кh����h]g|��������������h|�l\|�����������������X�^U|��������`�������XeP|�h]u|������������x��y|xi~|��������������/ -�pz|��������-����h]�|������������x���|xi�|����������\ -�p�|��������-@�x�`o�|�����������`����������Щ�p}����_�Р�����X������|p}��@��_�p�����0��|p}P�@��_��|�}����`@��_���������@��H���h]�������������������Bad argu]�آ h]0}���������������<}�n/}��������5�`���������������������`�Xe����hg������������hgC��ȥ���|p}��@��_���Ȧ��h��|p}��@��_�>}w}�����`@��_������������x�������@�p�h� -�������������ؤXe -�H�h]W���������������H���P���������8��xi`���������P��A��p\����������� �`����������h]J}��������������S}h]V}��������������W}xiZ}���������� -`oX}��������&����^T}��������H������XeJ}@�fg}���h��������hg+}H�x��������e�}���h����hgq|�@������h]�}������������P��}xi�}���������� -xi�}�����������( -�p�}��������-X�ت`������������H�X������|p}Э@��_�����ЮP��|p}p�@��_��}E~��������`@��_������������������������h]�����������������l��������0�^u���������x������Xep�h�0��8�L�h���Ю����h]���������������E���xi�����������0�l��������������H�����������������x�h]~���������������~xi"~������������Pj�^ ~��������0�h���������Xe~��h]1~������������P�4~h]7~���������������8~xi;~������������0 -`o9~��������&8�p�^5~���������������Xe1~���h����hg�}���� �`�`�����h]P~������������x��T~xiY~���������.8 -�pU~��������-��ز`����������|(����_�ص�����X������|p}е@��_�����жP��|p}p�@��_�b~*����`@��_���������h�0�8�p���h]����������������xi������l����x���h]�~��������������~xi�~��������������@ -xi�~������������H -�p�~����������-0���h]�~��������������~h]�~���������������~� ^�~��������8�p������Xe�~��h]�~�������������xi��������x�P -�p��������-�H��n���������5��h]�������������xi ���������h�X -^���������8�����Xe���h����hg�~кл������hg�~����������`�������@��H���X�0��8���0�8�p���`�h��3�@@��O��Y�Xi�xs�H��������������P��h]4�������������<xiB��������Ƚ` -xiA�����������h -�p=��������-`����n=��������5(�`����������+��@��� 0F�P�R�S�����hb`eXh�k�yX������|p}�@��_���������|p}��@��_�E�����`@��_���������h�h]���������������xi�����������p -xi����������������x -^���������h�������Xe��0��h����hg0� h���������hgL~ �`�������H�����`�������@��H���X�0��8���0�8�p���`�h�8��|p}x�إ������ج�x����`��x��8��ر�H��h����� ����������������8��������������������p�����������������`������������������8�������������������������(��������������8��p��(�`�`��� �x�������X�����0�h��@������,�x-�x.�8/��4�4�6�=�>(D`DXFG�LxR8S�S�VW�W�]�^`_�a�oxpHvw�w@y�zH{|@}�0���@���0���(�P���8���H�H�����`�������@��H���X�0��8���0�8�p���`�h��������������H�����`�����X�H�������H�8�p����������������������P@xp0 X�H8p� -p 0 h � ��h]K�������������8�O�`����������X�0������|p}����_���������|p}�����_�Q�x�h]�������������������xi������������ -xi���������8���� -�p���������-���h]!�������������P�$�xi*������������ -xi)���������@���� -�p%���������-���`o���������P�X�h]x����������������xi����������@�� -�p����������-���`o,�����������X�h]ـ�������������������xi����������@�� -�p����������-���h]�����������������h]�������������P��xi -�����������8�� -`o���������'����p���������-��P�`o����������X���h]�������������� �h]%���������������.�xi1������������ -`o/���������&H����p!�����������-���`o ������������`o������������H�`���������^����������Xe��h]��� ��������x������|p}8�@��_����8� ���|p}��@��_�5� -������`@��_������������X����|��*�����@����_�������������`�����X�H�������H�8�p�� -�H�:-��� �v�= `� �����h]A�������������P�D�xiJ����������� -xiI���������H���� -�pE���������-����nE���������5`�`������������������������HC ��� -����������� ����|p}@�@��_�� �@� ���|p}��@��_�M�������`@��_���������h]�����������E������������z����������� �����h]������������������`�����X�H�������H�8�p����������H��l��������������������������hg��(�����h]����h][���������������d�xii��������������� -�pe���������-����h]n�������������p��x�`ok��������� �`�h]��������������0����xi����������@�pI�l�����������������h]��������������0����xi�����������hJ�l�������������������h]����������������������xi������������ ��l��������������X���(�H���h�h]�������������� ����h]��������������P����l���������������������e^�����������������^����������X������� Xe��`�h]ˁ������������0��΁xi΁��������0�� pI�l΁���������������h]ց������������0��فxiف����������� hJ�lف����������������h]������������������� xi������������ ��l��������������H����8�p�����h]�������������������h]��������������P����l����������������������^߁���������������^ԁ��������H������XeˁP�hgW� �����������h����hg=�����������`��������p�����XP |�@�HC ������������HC ����x��x����|p}��@��_�X�x�P!��|p}8�@��_��F����������`@��_�����������ҏ�u���h��Ȁ�� U(��݀��������H ����3����}6� �P��A�������*� � �����������������������P@xp0�3������������ ������������������������pNh]���������������%�xi*�����������`�� -�p&���������-��0�h]/�������������p��9�`o,���������x���`��������x�������A�������*� � pN����b -�������|p}��@��_�`����� ��|p}@�@��_�;�������`@��_���'���������������������%�����������ເн�.this_function]�P��s�`������������������܀������@��x��p������P��������輁h��Pցh]E�������������0��H�xiH���������h�hJ�lH��������������8�h]P���������������T�xiT���������(� ��lT�����������������������@�h][������������� ��b�h]d��������������l��lU������������������@���K�^N����������� �����XeE�x�h]w�������������0��z�xiz���������H�pI�lz����������������h]������������������xi����������� ��l������������������p������רh]�������������� ����h]��������������P����l������������������� �`���^����������`������Xew�X�`���������X8�.�(/�p/� 1�h1��1�(7�������|p}0�@��_����0����|p}��@��_����֩����`@��_�©��������h�����0��x��h�����`��������H�H�����P���P@xp0 XX1�X2��3��4��7��\��M� N�P�XP�hj��j�0l�xl�h]��������������0����xi������������hJ�l������������������h]����������������‚xi‚��������� ��l‚������������P� @x��h]ɂ��������������҂h]Ԃ�������������܂�lÂ��������������������^���������������Xe��h]��������������0����xi�����������pI�l��������������p�h]������������������xi����������� ��l��������������0h XPI�h]�����������������h]�������������P� ��l���������������������%�^����������������Xe������������������������P@xp0 X�H8p����H��������ؤ�hg���0�������h]�������������0���xi�����������K�l���������������h]&���������������*�xi*����������� ��l*�������������H�8p(;�h]1��������������9�h];�������������P�>��l+������������������^$��������������Xe� hg�����(����� ������������x����`���yH~x~Ѐ��ЈȊ؍��h P�p����X�������� ����h]P���������������Y�xi\��������� � -�pZ����������0� -� -h]e�������������0��h�xih���������� �G�lh�������������p � h]o���������������s�xis����������  ��ls�������������0 h   � @c�xiz����������P � -h]}�����������������xi������������ � -`o����������'h � �lt������������������ � ^m���������� (����Xee��h]��������������p����h]��������������0����xi������������G�l�������������� Xh]������������������xi����������H ��l������������������-xi����������� -h]ă������������ ��˃�l������������������`�v^�����������P����Xe����h����hg��������hgL�0 � ����h]ڃ������������0��݃`fӃ�HC x���� ����h]���������������������ha����x��h]����������������������v�o��������^�������������p�����Xe������t�o�����"��x��X����@��_�����o�"0��8����xi�������0�E�xi�������x��H��������delimiterG]�� ���Cxi�������(�;�]�@�g;�xi�������H�x��������xi�������]�xi���������0��������posix]����DA"xi��������xi����������������� j�K����^�����h]"�H��������#�ha����HC ���]� #�^����D������`����Xe����P`'�� H�h]-��������������2�H��j(����xi[�������H^���@H^��|p}�+@��_� @RC'�6 �@i�|p}@��_�t��������`@��_�����������c���i��#��v@Y�Ƹ‰H -��k�P� -�P:-�����P%�s��� ��v�= `>��!N�������`���8!�!0#�#�$x+(6�)�-�.�/807�78@8p!h#0%�+�\�\`^�^e�H(HC �� ���������HC �H -�����HC �� -������������� H� -�� 0� �� �h�( jh x"p$8.�T�h`�`}������ `"h]��������������`>���xi���������� !��h]���������������!��ha}�8!�HC �`>���h]�����������������!����^��������������!� ����Xe����"`�������"�X$h]���������������i���xi����������Pj�h]���������������#��ha��0#�HC ��i���h]�����������������#����^��������������##����Xe����$`�������$h]�������������������h]��������������P%��ha���$�HC �������('���|p}H'@��_�(((�N!�(�|p}�(@��_�̄������`@��_����������1�f8g�0@1x2�P�Ѕ�py�y�{`����)�-�.�/807�78@8�=(>�>�>�@A�A(�p��������� ��< =h]ф������������@Y�҄h]Մ������������ބxiބ��������H*X[�lބ�������������)*xi�����������* `o����������'`*�*`̈́����p+� .h]��������������P-��hä́x+�%��0����P%�s�0���л�i��#��v@Y�P-Ƹ‰� ��v�= ��6&�(5H -��k�P� -�P:-������`>��!N���@�HC �@Y���h]����������������P-����^��������������-�*����Xe�����-�cȄ�����0(+�/�0h]��������������P-��xi�����������. xi����������8/�� �p����������2�./h]���������������#��n����������5�/`o����������P/�/h] �������������P- -�p -����������80����Xe -�p0`��������1�5�A�B IK�N`�xc��h��k��n��% 3���|p}@3@��_�4 4`K!�4�|p}�4@��_����������`@��_�I����������D1 ��23x����56P��(�89X Xf;<�>�?Xq@��A( B7�78@8�=(>�>�>�@A�A8B�BPI�IHJ�P� ��(� ��`������5h]������������� ��h]��������������6�ha�(6�1HC � ��@ip!h#0%�+`6h]*�������������P-+�xi/���������x7 �p,���������27H7h]:��������������6>�h]A�������������J�h]K�������������P-L�lJ�������������8@8^?����������7x8����Xe:��8`��������h9�@�A�k��n��x��{���� ���1p;���|p}�;@��_�P<p<�<=�|p}0=@��_�Z���|�����`@��_��������������6P��78�\X :;h��=>�Xq@A( xwCp����=(>�>�>�@A�������P��� ��(� ��h]h�������������P%k�h]p���������������y��pl���������-�=(>h]��������������P%��h]��������������0���xi����������@?���l���������������>?�?�l������������������X?�?^�����������>�?����Xe�� @�h����hgd�`>p@�@����h]���������������6��h]��������������P%��^�����������@A����Xe��8Ahg&��79 9����h]���������������F�DžB8Bh]ȅ�������������6̅�l�������������������ABXe��pBh]���������������6��xi����������HCX[�l���������������BCxi����������C �p���������-`C�C`��������pD�H�1xF���|p}�F@��_�XGxG�GH�|p}8H@��_� �$�����`@��_����������e�8.�h����hg���C(DI����h],��������������!8�h];��������������6?�xiB����������I`&�`o@���������&�I�Ih]H��������������!T�`oF���������&JHJ^9���������PI�J����Xe,��Jh]\��������������#l�7�78@8�=(>�>�>�@A�A8B�BPI�IHJ(KhLh]o��������������6s�xis����������L�`�ls�������������hL�L8MXMxi����������M( �lt������������������L(Mxi����������(N/0 �p����������-�M�M^m���������(K@N����Xe\��N�)�-�.�/807�78@8�=(>�>�>�@A�A8B�BPI�IHJ(KhL8!�!0#�#�$x+(6�)�-�.�/807�78@8�=(>�>�>�@A�A8B�BPI�IHJ(KhL�P0Q�Qh]S��������������!_�h]b��������������?�v�xQ�Q Th]w��������������!��h]���������������#��8!�!0#�#�$x+(6�)�-�.�/807�78@8�=(>�>�>�@A�A8B�BPI�IHJ(KhL�P0Q�Q�QUZ�[�\�b�n����������5�Q�lb�����������������0QhQ^`����������PPT����XeS��Th]���������������#��`���������U�\��W���|p}�W@��_�xX�X�X8Y�|p}XY@��_��� �����`@��_���������Z�[h]���������������!̇xi̇���������ZX[�l̇������������ZPZxiև��������[8 �pԇ��������0�Z�Zxi�����������[`&�h]���������������!��`o����������&`[�[`f���[xi���������h\`&�`f�8\hg�� [ \�\����h]*��������������!6�xi6���������0]X[�l6��������������\]xi@����������]@ �p>���������0H]�]`��������X^c�``���|p}�`@��_�@a`a�ab�|p} b@��_�C�e�����`@��_����������bh]R��������������!^�`fK��b`��������xcHh��e���|p}�e@��_�`f�f�f g�|p}@g@��_�k�������`@��_���������xiz���������0h(2�`fs�hhg&��]^0c����hg��UHU`h����HC �H^�����h]�����������������h����ha����i�h]�����������������h�����vd���������^�������������`i�i����Xe�����i�td������"H^�� ��@��_��j�j�jd�p(j����xi������� kx5����lx5��|p}�l@��_��m�m�!`n@o���|p}�n@��_���������`@��_������������Xw�n�H -��o�k�P� -��o:-�����|���~� �@ov�= ��p&�(5�p�phq�qxr�tw�x�y�{�|�|P}�}�~�����8w�{HC 8k� ���������HC 8kH -���������HC 8k� -��������� ��p��h]���������������p��HC 8k �����H� -`r0t`tx�~��ȅh]���������������F�ˆ�q�qh]È�������������pLj�l������������������hq�qXe��rh]ӈ�������������p׈xi׈���������rX[�l׈������������xr�rxi����������hsH �p߈��������-�r8sxi�����������s(2�`f���s�h����hgψ�st t����`�������t�wh]���������������� �h]��������������p�xi���������Pu�`�l��������������t u�u�uxi ���������vP �l�����������������hu�uxi'����������v/X �p#���������- vxvh]'�������������Xw)�ha��w8kHC 8k���)�^�������������w�v����Xe�����w`4�����Px�|h]:����������������K�h]N��������������pR�xiR����������x�`�lR��������������x�x`y�zh]^��������������pb�xib����������yX[�lb��������������y�yxil���������pz` `oj���������'z@z�lS�����������������yPyxis���������P{/h �po���������-�z {h]s�������������|u�ha4��{8kHC 8k���u�^��������������{h{����Xe����H|h]���������������p��h]���������������?���0}P}�}h]���������������p��h]��������������Xwȉ�n����������5�}�l�������������������| }^�����������|�}����Xe��H~h]ԉ�������������p؉xi؉��������X[�l؉�������������~�~xi�����������p �p����������-0ph]��������������Xw���n����������5�`o�����������0�h]���������������p�xi����������(2�^�����������؀����Xe�� ��h����hgЉ`�p�������h]��������������p��phq�qxr�tw�x�y�{�|�|P}�}�~���ȁ�����x�Їxi���������8�X[�l�������������ȁ�xi�����������x �p���������0P���h]#�������������|4�`o ���������؃�h]<��������������p@�xiD�����������`&�^A������������Ȅ`�����`oB���������&��ȄXe<���h����hg �P���������h]R�������������Xw\�xik���������`�`&�h]q��������������pu�`oo���������&0�x�`fd����h����hgN����������p�`r0t`tx�~��ȅ��h]���������������p��`f{�ЇHC 8kx5�����h]���������������� �����ha����h�8kh]���������������� ������v����������^���������������������Xe���� ��t�������"x5�8kq��@��_���(����j������xi�������������� �����|p}@�@��_�� �@�������|p}��@��_��������`@��_���������H -����k�P� -�0�:-��� ���v�= �0�&�(50���Ȑ0�ؑ ��HC ��� ���������HC ��H -���������HC ��� -��������� �����h]��������������0���HC �� �����������x�h]���������������F�NJ�0�h]Ȋ������������0�̊�l������������������Ȑ�Xe��h�h]ڊ������������0�ފxiފ��������@�X[�lފ������������ؑ�xi����������Ȓ� �p����������0X���h]��������������0���xi�������������`�l�������������� �X����xi����������@�� �l����������������������xi�����������/� �p���������-X���`o��������������`fӊ8�HC ���������h]����������������������ha����ؕ��h]�����������������������v����������^�������������0�h�����Xe�������t�������"�����x���@��_���������P�������xi��������pv�����pv��|p}��@��_�p����!0����X��|p}P�@��_�)�������`@��_���������Р@Y��Ƹ‰H -�X��k�P� -���:-��p��h��̙� ��v�= �~���v]�i��(����H�8�p�p�`�����P���`�x�����`���H�HC �� ���������HC �H -�����HC �� -���������x�P�p�����8���h]6�������������X�?�xi?��������� �X[�l?�����������������xiK������������ �pG���������-8�x�xi[���������0�(2�`fT���h����hg2���H�`�����`d�������h]h��������������~�n�h]h���������������n�had�(��HC ��~�h��X����|p}x�@��_�8�X�x����|p}�@��_�x�e�����`@��_���������ЩH�8�p�p�`�����P���`�x���(�`����h]}�������������@Y�~�xi����������@�� `y�������Цh]�����������������hay���РHC �@Y���h]���������������������^�������������H������Xe�������ct������X�0���h]�����������������h]��������������X���xi����������اX[�l��������������p����p����������/8���h]�����������������p�����������p�����Xe����`��������P�حH���РX����|p}x�@��_�8�X�x� ���|p}�@��_���e�����`@��_���������p�`�����P���`�x���(�`����`������ �8�h]��������������p����h]��������������X���h]�����������������l��������������`���h]��������������h���ha���ЩHC �p����h]����������������h�����^���������������Ю����Xe������h]ŋ�������������F�ϋ����h]Ћ������������h�Ӌ�lŋ����������������P���Xeŋ��h]��������������h���xi����������ȱX[�l��������������`���xi����������P�� �p����������0�� �`������������Щ�����|p}�@��_�ص������|p}��@��_���_�����`@��_���������x���(�`����h]�����������������h] �����������������p���������-x���h]���������������$�h]'�������������h�*�^%���������(�`�����Xe���h]C���������������I�xiM���������h�`&�h]S�������������h�V�`oQ���������&8���^J�������������H�����`oK���������&���XeC���hg�������������h����hg܋h���к������(����H�8�p�p�`�����P���`�x���(�`�����P�h�X�h]n���������������t�h]y������������������pu���������-�P�xi������������(2�`f��ȼ�h����hgj����(�����h]������������������xi����������нx5�l��������������h���8�X�h]�������������������l��������������������(�`f����HC �pv�����h]���������������������ha����H��h]����������������������v���������^���������������ؿ����Xe������t������"pv��h���@��_���������h� ����xiÌ�����`�h)����h)��|p}� @��_�����[�z�N ��(��|p}��@��_�ތr� ����`@��_����������~�/���潳�PE���~���H -���k�P� -�H�:-��(U�fA��� ���v�= H/���v ������H�`���p��������������(���H�p������hG�ŀX@��^��5�@H��v��)��.�{�(j�)����x���8k���x�h�`����z�(�HC x�� ���������HC x�H -���������HC x�� -���������H/�����/�H���h]ߌ����������������h]������������������HC x�H/�����HC x��/������ #X�h�������0�`�h]���������������F�������h]�������������������l������������������`���Xe���h]��������������F������h]�����������������l�����������������p���Xe��h]���������������"�h]'���������������)��p#���������-����xi8���������`���`f1�0��h����hg���x�������h]A���������������E�h]H���������������M�xiM���������p�H^�lM��������������@�����h]V���������������Z��lN���������������������^F�����������0�����XeA���h]a���������������c�h]f���������������k�xik�����������H^�lk�������������(�`����h]t���������������v��ll���������������������^d�����������P�����Xea���h]������������������h]�������������������p����������-�H�xi��������������`f�����h����hg~���� �����`ɍ������`�h]͍������������PE�֍�H�`���p��������������(���H�8�������x�h������ �X���p�������xiٍ�������� �� h]ٍ��������������ڍhaɍ8�x�HC x�PE�ڍh]����������������������^���������������������Xe�����x�����|p}(�@��_����(����|p}��@��_���U�����`@��_���������p�����x�h��c������������h]������������������h]������������������xi����������x�X[�l���������������H��p����������/����h]��������������� �p���������������Xe�H�`�������������������|p}�@��_���������|p}��@��_� �U�����`@��_���������x�h�h]����������������xi������������`�l�������������x���H�h�h])���������������2��l�������������������8�xi8���������(�/� �p4���������-�����n4���������5@�fI����h����hg�����������X�h�������0�`��������0�����8`Z���������h]^�������������(U�e�h]h���������������l�xil�����������X[�ll��������������P�h]m���������������s�haZ���x��z�h���� X[�P���7 ����ˈ: �/���潳�(U���fA��� ���v�= H/���v �H -���k�P� -�H�:-��k�8�J��،�(�(�A -PE���~���h�(�N��HC x�(U�s�h]����������������������^���������������������Xe����0�`y���������h]}�������������h���h]������������������h]������������������`o����������' �X�h]��������������(���hay���x�HC x�h���h]����������������(�����^�������������p�������Xe������`ǎ����X��h]ˎ������������k�ҎxiՎ����������� h]Վ������������8�֎haǎ��x�HC x�k�֎h]����������������8�����^���������������������Xe������x������|p}��@��_�������P��|p}p�@��_���G�����`@��_���������������� ���c܎����P�x�8�h]��������������8���h]������������������xi���������� �X[�l�������������������p����������/��8�h]��������������8��p�����������������Xe����`������������(������|p}��@��_�������@��|p}`�@��_��G�����`@��_��������� ��h]����������������xi������������`�l������������� �X����h]�������������8�$��l���������������������xi*�����������/� �p&���������-H����n&���������5��f;�0��h����hg �(�X�p������H�`���p��������������(���H�8�������x�h������ �X���p����������� ��P���� �X���p��H���P�` - NhRP�0h��0" #X#�)`L��������h]P��������������z�U�h]X���������������Z�xiZ�����������X[�lZ�������������P���h][�������������h�a�haL��x�HC x��z�a�p����H�0�� -h]����������������h�����^���������������������Xe����0�`g��������h]k�������������،�p�h]t�������������h�y�h]|�������������8���`oz���������' �X�h]��������������(��hag���x�HC x�،���h]����������������(����^�������������p������Xe�����`ʏ����X h]Ώ������������X[�ԏh]؏������������(�ߏh]��������������(���p����������/��h]��������������(���h]��������������(��r؏��������H�h]��������������P��haʏ�x�HC x�X[���h]����������������P����^�������������������Xe�����`������x h]�����������������xi����������� xi���������8��� h]���������������ha�Px����R�~���hN��<X[�P���7 �/���潳�(U���fA��@Y�� -Ƹ‰ k�8�J��h�(�N�������ˈ: H��@a�GpB� ���v�= H/���v �،�(�(�A -H -���k�P� -�H�:-���z�h���� PE���~���HC x�����h]���������������������^������������������Xe����( `������ � h] �������������@Y�!�xi$���������H -� h]$�������������� -%�ha�` -x�HC x�@Y�%�h]����������������� -����^�������������  -����Xe����8 ��X�h�������0�`��������0�����8� �`hx�x�H���|p}h@��_�(H�YC'��|p}@��_�/�ʔ����`@��_���������(P�0h��0" #X#�)p*�*,�1�2�c+�����`�Hh]2�������������� -3�h]7�������������P=��p4���������1Ph]A�������������� -B�pA���������������XeA�`���������`K�K�O�X� ����|p}�@��_����TC$P�|p}p@��_�D�ʔ����`@��_����������0h��0" #X#�)p*�*,�1�2�2(4`4h]P�������������� -Q�h]V�������������P\��pR���������-0h`��������(J0J(0���|p}P@��_�0�H!��|p}�@��_�^�������`@��_����������5��0" #X#�)p*�*,�1�2�2(4`4�9�:h]l�������������(q�h]t�������������Pz��pr���������0��`����������3�����|p}�@��_�� � �  -P!�|p}p!@��_�|�)�����`@��_����������-0" #X#�)p*�*,�1�2�2h]������������������xi�����������"�`�l��������������0"h"#�#h]��������������8���h]��������������� -��`o����������& #X#�l�������������������"�"xi����������X$/� �p����������-�#($`���������$,('���|p} '@��_��'( (�(�|p}�(@��_���t�����`@��_����������)p*�*h]N���������������P�xiP����������) ��lP��������������)�)P*h+h]W�������������8�^�h]a�������������� -b�`o_���������&p*�*xie���������P+� `oc���������&�* +�lQ�����������������*@*`fG��+h]~�������������� -�xi�����������,� �p����������-,P,`�������� -�3((/���|p}H/@��_�0(0H0�0�|p}�0@��_��������`@��_����������1�2�2h]������������������xi����������2 ��l���������������1�1x23h]�������������8� �h]�������������� -�`o���������&�2�2�l�����������������(2h2`f��H3�h����hgz��,�,�3����hg��p$�$�3����h]3�������������(�:�h]=�������������PC��p;���������0(4`4`�������� 5�H�(7���|p}H7@��_�8(8H8�8�|p}�8@��_�E�ۓ����`@��_���������XC�9�:�:�@0A�A`Gh]U���������������Y�xiY���������:�`�lY��������������9�9x:;h]e���������������n�h]q�������������� -r�`oo���������&�:�:�lZ�����������������(:h:xix����������;/ �pt���������-H;�;`��������p<�A�5x>���|p}�>@��_�X?x?�?@�|p}8@@��_���2�����`@��_����������@0Ah]��������������!�h]$�������������� -%�^"����������@0A����Xe�hAh]<�������������� -=�xiB���������8B �p>���������-�AB`���������B0H�5�D���|p}E@��_��E�EF�F�|p}�F@��_�E�ѓ����`@��_���������`Gh]�����������������xiÓ���������G ^����������`G�G����Xe���G�h����hg8�PB�BHH����hgQ��;(<XH������0" #X#�)p*�*,�1�2�2(4`4�9�:�:�@0A�A`G�h����hg/��4�4�I����hgh� `�I����f���0h��0" #X#�)p*�*,�1�2�2(4`4�9�:�:�@0A�A`GLM@MHOpP`Q�QS�S�S�h����hgL���PK����`�������K�Oh]�����������������h]��������������� �xi ����������L�`�l �������������LPL�LxMh]���������������!�h]$�������������� -%�`o"���������&M@M�l ������������������L�Lh]%�������������hN&�ha��N(HC x��� &�(�p����H�0�� -HN�R ah]����������������hN����^�������������HO�M����Xe�����O`.�����0P�Sh]2���������������8�h];���������������=�xi=����������P�`�l=�������������pP�P@Q�Qh]I�������������8�P�h]S�������������� -T�`oQ���������&`Q�Q�l>������������������P0Qh]T��������������RU�ha.�hR(HC x��� -U�h]�����������������R����^�������������SR����Xe����@Sh]a�������������hNi�h]n��������������Rt��pj���������-�S�S�nj���������5Tf~��h]��������������hN��0h��0" #X#�)p*�*,�1�2�2(4`4�9�:�:�@0A�A`GLM@MHOpP`Q�QS�S�S�TxW�Wxi���������� W/ �p����������-�T�Vh]�����������������h]”������������� -Ô^����������xW�W����Xe���W�h����hg��8W8XPX����hg]�XT�T`X����P�0h��0" #X#�)p*�*,�1�2�2(4`4�9�:�:�@0A�A`GLM@MHOpP`Q�QP�0h��0" #X#�)p*�*,�1�2�2(4`4�9�:�:�@0A�A`GLM@MHOpP`Q�QS�S�S�TxW�W�H�`���p��������������(���H�8�������x�h������ �X���p����������� ��P���� �X���p��H���P�` - NhRP�0h��0" #X#�)p*�*,�1�2�2(4`4�9�:�:�@0A�A`GLM@MHOpP`Q�QS�S�S�TxW�W�`�a8fpf�f`h�hixn�n(op@v�w�xHz�{�{�|�|�� �������Ї`Д����``bh]Ԕ������������H��הxiڔ���������`��h]ڔ������������@aܔhaД�`x�HC x�H�� ܔh]����������������@a����^��������������a�`����Xe�����ax��c���|p}�c@��_��d�d�d Xe�|p}xe@��_�D�!�����`@��_���������pj8fpf�f`h�hixn�n(op@v�w�xh]E�������������� -F�h]I���������������R�h]U��������������b�`oS���������&pf�fxie���������Pg `oc���������&�f g^G���������8fhg����XeE��g�c@������i�g�h�ih]h�������������� -i�h]m���������������t��pj���������1`h�hh]x�������������� -y�px����������i����Xex�Hi`���������iz0b�k���|p}l@��_��l�lm�m�|p}�m@��_�{�!�����`@��_���������8rxn�n(op@v�w�xh]��������������� -��h]�������������������p����������-xn�nh]������������������xi�����������o�`�l��������������(o`o�oph]��������������� -���l�������������������o�oxi�����������p/( �p����������-Pp�p`o�����������n�p`���������q�ypj�s���|p}�s@��_��t�t�t`u�|p}�u@��_��������`@��_���������@v�w�xh]ƕ������������@aɕxiɕ���������vX[�lɕ������������@vxvxiՕ��������0w0 �pѕ��������-�vwh]��������������@a��xi�����������w��^������������w�wXx����`o����������&�w�wXe��xh]�������������@a �xi ���������y �^ -�����������x�x�y����`o ���������&�x�xXe�0yhg•Hw�x�y�����h����hg��0qpqz����h]��������������@a��xi�����������zX[�l��������������Hz�zxi����������8{8 �p����������0�z{h]��������������@a��h]������������������xi����������0| ��l���������������{|�|(}h]Ö������������8�ʖh]͖�������������ږ`o˖��������&�|�|�l������������������H|�|`o����������&�{h}`f���}`��������`~����`�x�h����|p}��@��_�H�h�����|p}(�@��_���n�����`@��_����������� �������Їh]��������������8���h]����������������^������������� �������`o����������&�� �Xe��X�h]����������������xi���������h��`�l��������������8�Є��h] �������������8�'��l���������������������xi-�����������/@ �p)���������-(���h]@�������������8�G�p@���������������Xe>�@��h����hg�ȅ��������h]V���������������X�xiX���������H� ��lX������������������Їh]_�������������8�f��lY�����������������`���`fO��hg��P{~~����HC x�h)� ����h]����������������������ha������x�h]�����������������������v͌��������^�������������H�������Xe�������t͌�����"h)�x����@��_�������͌0��"�����j(��������(� z��xix������P�X.�����X.��|p}�@��_�Ѝ�����p�h��|p}��@��_���������`@��_���������H -����k�P� -��:-��� �p�v�= ��&�(5�Ȑ��h�HC h�� ���������HC h�H -���������HC h�� -��������� �Ȑ��h]�����������������HC h� �����X�8�Бh]�����������������`f����HC h�X.�����h]����������������������ha����0�h�h]�����������������������v����������^���������������������Xe�������t������"X.�h�H���@��_��������� �P�$����xi������H��z������z��|p}� @��_�Ȗ��8�!!�� h����|p}��@��_�їD�����`@��_���������x����z��dH -����k�P� -���:-�� T���*��8�����I� �h�v�= ���&�(5�������������@���`����ئ0�ШP���؟����h�HC `�� ���������HC `�H -���������HC `�� -��������� ���֗h]җ��������������֗HC `� ������� ��X�������x�ذh]ޗ�������������F���ؚ��h]�������������������lޗ������������������ȚXeޗ0�h]������������������xi�����������X[�l����������������؛xi�����������H �p���������- �`�xi����������(2�`f����h����hg����0�H�����`!�����НȠh]%������������� T�)�h],���������������0�xi0���������x��`�l0��������������H����xi<���������0�P �l1�������������������Оh]=���������������>�ha!���`�HC `� T�>�h]����������������������^�������������@�H�����Xe����x�`D�����(���hasRoot]�0���Ih]H�������������8�O�h]S���������������W�xi\����������/X �pX���������-��ءh]c���������������d�haD�`�`�HC `�8�d�h]����������������������^�������������� �����Xe����8�`j�������`�h]n����������������q�xiu���������X�` xit�������������h h]u���������������v�haj���`�8�����I� �h�v�= ���&�(5@Y���Ƹ‰�����z��dH -����k�P� -���:-�� T���*��Ќ������nHC `����v�h]����������������������^�������������ئp�����Xe�����`|�������X�h]��������������Ќ���xi�����������łh]������������������ha|�0�`�HC `�Ќ���h]����������������������^�������������Ш�����Xe�����`�����|p} �@��_���� � ���|p}��@��_���������`@��_���������H���8�(���P���x�p��8�p�8�h]��������������@Y���h]������������������xi���������� �X[�l������������������xi������������p `o����������'8�x�`������H���h]������������������ha��P�x�HC `�@Y�����؟����h���h]����������������������^�������������8�������Xe����p��c�����������h�h]������������������xi������������x �p����������2(�`�h]����������������˜p�����������������Xe�� �`��������ȲX��x�д���|p}��@��_���е��p��|p}��@��_�Ę������`@��_���������0�P���x�p��8�p�8�h]̘��������������Иh]Ә��������������טxiט�����������`�lט����������������X�x�h]�������������������lؘ�����������������H�^ј��������P�������Xe̘�h]������������������xi����������ع/� �p����������-p���`��������x�8�H������|p}��@��_�`����� ��|p}@�@��_��W�����`@��_���������0��8�p�h]�����������������n���������5�`��������������������|p}��@��_�������X��|p}x�@��_� �O�����`@��_���������8�p�h],���������������/�h]2���������������3�^0���������8�p�����Xe,���f?�ذ�h����hg �8�h�(�����`������������H������|p}��@��_�������X��|p}x�@��_�]�������`@��_���������8�h]������������������xi����������Pj�^����������8�p�����Xe����hg����0�h����������������@���`����ئ0�ШP���8�(���P���x�p��8�p�8�@�H�0�h�@�x�h]Ù��������������ƙxi̙����������� xi˙������������� �pǙ��������-@���h]ܙ����������������xi������������`&�xi������������(2�rܙ��������H�����`fՙ��h����hg���P�h�����p���X�������x�ذx���h]�����������������h]����������������xi ������������ �p���������-h���`o���������0���//] �h���sxi�����������p�`f����h����hg��(��������h]-���������������1�xi1����������� ��l1�������������@�x��0�x�xi8���������`�� h];���������������>��l2��������������������`f&���HC `��z�����h]���������������� �����ha����h�`�h]���������������� ������v����������^���������������������Xe���� ��t������"�z�`�@���@��_���(������&����xiJ� �������i��� ��i��|p}�� @��_�� ��IC<0� ���x�|p}��@��_�e�ԣ����`@��_�����������LK���v:�H -����k�P� -�0�:-��H}�P��S_���z��d� ���v�= �h�&�(5h�����0�H���(����������P�p���h���0�0������HC ��� ���������HC ��H -���������HC ��� -��������� ���j�K�0�o�h]f�������������h�j�h]l���������������o�HC �� �����HC ��K������hy���(�8����wh]{���������������~�h]�������������������p���������-H����n���������5��h]�������������������n����������8(�xi������������`��p����������-`����n����������5��`o�������������h]��������������x�š����xiÚ�������� ��s�hm�������������������s����������8�Xe�����h����hgw�H���������h]���������������F���`���h]��������������h����l�������������������P�Xe����`�����p� �h]�������������H}� �xi������������ h]�������������P��ha�����HC ��H}��h]����������������P�����^���������������������Xe������`���������h]�����������������xi ������������ xi���������8���� h] �������������(�!�ha�P���P����*&{� -K���v:�� ���v�= �h�&�(5@Y���Ƹ‰H -����k�P� -�0�:-��H}�P��S_���(�z��dЌ� ����n�����F��� HC �����!�h]����������������(�����^�������������p������Xe������`'�����X���h]+�������������Ќ�7�xi:����������łh]:������������� �>�ha'�����HC ��Ќ�>�h]���������������� �����^�������������h�������Xe������`D�����P�h]H�������������@Y�I�h]H���������������I�haD�����HC ��@Y�H�h]T���������������W�h]\���������������e���0�H���(����������P�p���h���0�h����`���0�p�0�0�h�H�x������x�pX���������-0�h��nX���������5��h]i���������������l�xil�����������X[�ll��������������P�xiv����������� �pt���������0����`of����������� �h]{���������������~�xi~����������X[�l~�����������������h]��������������h���xi������������X[�l��������������`����p����������1 ���`ox���������`� �`���������������h�G�I�������|p}�@��_�����`E!���|p}��@��_���`�����`@��_����������p�0�0�h�H�x������x�B�BHC�C Dh]������������������xi������������X[�l��������������p���h]��������������h���xi������������X[�l��������������0�h��p����������-����h]����������������Ûh]ț������������h�̛�pě��������-0�h�`o��������������xiݛ��������P���`f֛ ��h����hg����h�������`��������h]�������������������h]������������������xi������������X[�l��������������H���xi���������8�� `o����������'���h]����������������ha����h�HC �������x0��������h�h]����������������������^�������������x�P�����Xe������` -�����`�X�h]�������������P���xi"������������ xi!������������� h]"���������������#�ha -�0�h�HC ��P��#�h]����������������������^���������������������Xe�����h�����|p} �@��_��� ��|p}�@��_�/�Š����`@��_�������������xh]0���������������1�h]4�������������h�8�xi8��������� X[�l8���������������xiB����������� `o@���������'8x^2���������������Xe0��c+�����P8�h]E���������������F�xiJ��������� � �pG���������2��h]O���������������P�pO����������x����XeO��`��������X�� hB��`���|p}�@��_�@``A! �|p} @��_�R�Š����`@��_���������8 T�@ *��h -X � � ���@$�$ %�&,P,@-�2 `\�����( -� h]b������������� T�f�h]i�������������h�m�xim���������� -�`�lm�������������h -� -8 X h]y���������������z��ln������������������ -( h]z�������������@ {�ha\�� �HC � T�{�^�������������� � ����Xe����� h]��������������@ ��xi����������X /� �p����������-� ( `��������� @����|p} @��_�� ��|p}�@��_���������`@��_�������������h]6������������� �B��n5���������5�`��������0x8���|p}X@��_�8X��|p}�@��_�D������`@��_�����������h]R�������������P�W�h]Z���������������[�xi^���������X� `o\���������&�(^X����������p����XeR��fm�h�h����hg1���0����`���������X&0A�����|p}�@��_����`�|p}�@��_���������`@��_���������(@$�$ %�&,P,@-�2989�>@P@h]������������������xi����������� xi������������� �p����������-@�`����������$0&8�!���|p}�!@��_�x"�"�"8#�|p}X#@��_���������`@��_���������$�$ %h]V������������� �b�xie���������Pj�^c���������$P$����XeV��$h]x�����������������h]������������������xi�����������% `o����������& %X%^�����������$�%����Xex��%�h����hg��HH&����h]������������������xi�����������& �p����������2�&�&`���������'�@8�)���|p}�)@��_�x*�*�* 8+�|p}X+@��_���������`@��_����������:,P,@-�2989�>@P@h]��������������@ �h]��������������� -�xi -����������,�`�l -�������������P,�, -@-h]�����������������l ������������������,-�p���������-,x-`��������X.�9(`0���|p}�0@��_�@1`1�12�|p} 2@��_��������`@��_����������4�2989h]5���������������;�p5�����������2����xiA����������3 xi@����������3��( �p<���������-3�3`��������x4�9�.�6���|p}�6@��_�`7�7�7 8�|p}@8@��_�D�ܟ����`@��_���������989h]ğ������������(�ǟh]ʟ��������������˟^ȟ��������989����Xeğp9�h����hg/��304�9����`��������`:@�@(h<���|p}�<@��_�H=h=�=>�|p}(>@��_���������`@��_����������>@P@h]g���������������m�xiq���������P?0 xip����������?��8 ^n����������>h?����Xeg��?h]��������������(���h]������������������^����������@P@����Xe���@hg���-.:�����h����hg��'H' A����h -X � � ���@$�$ %�&,P,@-�2989�>@P@hg��p � p����h]Ѡ������������P�֠h]۠������������(�ޠ�pנ��������-�B�Bh]��������������(���h]������������������^����������HC�C����Xe���Ch]�������������(��xi����������D@ xi����������D��H �p���������- D�Dh]#�������������(�&�p�0�0�h�H�x������x�B�BHC�C D(EhFH�H(Ih])�������������h�-�xi-����������FX[�l-�������������hF�F^'���������(E�F����Xe#�(G�h����hg ��DxG�G����hg͠CD�G����h]C�������������h�G�xiG���������hH ��lG�������������H8H�H�H(Ih]N�������������P�S�h]U�������������(�X��lH������������������H�H`f<�`I��0�H���(����������P�p���h���0�h����`���0�p�0�0�h�H�x������x�B�BHC�C D(EhFH�H(I�TUW�W(]^d8ipi�j�p�q�qhsuv8v`��������0L�V�t�w��8N���|p}XN@��_�O8Opv!�O�|p}�O@��_�f�У����`@��_����������P�TUW�W(]^d8ipi�j�p�q�qhsuv�LHR���|p}hR@��_�(SHShS �S�|p}T@��_�r�{�����`@��_��������� Y�TUW�W(]^d8ipi�j�p�q�qh]s���������������t�h]w�������������h�{�xi{���������hUX[�l{�������������U8Uxi�����������UP `o����������'�U�U^u����������TV����Xes�HV�cn�����XX�V�W@Xh]������������������xi����������hWX �p����������2W8Wh]������������������p������������W����Xe���W`���������X8s�P�Z���|p}�Z@��_��[�[�[ H\�|p}h\@��_���{�����`@��_����������l(]^d8ipi�j�p�q�qh]��������������h���xi�����������]�`�l��������������(]`]�]^h]�������������������l�������������������]�]xi�����������^/` �p����������-P^�^`��������x_�j Y�a���|p}�a@��_�`b�b�b c�|p}@c@��_�á������`@��_���������0ed8ipih]^������������� �j��n]���������5d`���������d�j�j�_�f���|p}�f@��_��g�g�gXh�|p}xh@��_�l�������`@��_���������8ipih]z�������������P��h]������������������xi�����������ih `o����������&pi�i^����������8i�i����Xez�0jf���V�h����hgY�8dhd�j����h]��������������(���xiĢ��������Xkp xiâ���������k��x �p����������-�jpk`��������@l�q�r YHn���|p}hn@��_�(oHoho�o�|p}p@��_�Ǣs�����`@��_����������p�q�qh]=������������� �I�xiL���������Pj�^J����������pq����Xe=�0qh]]�������������(�`�h]c���������������d�xig���������8r� `oe���������&�qr^a����������qPr����Xe]��r�h����hg���k�k�r����hg���^0_s����h]��������������(���xi�����������s� xi����������t��� �p����������-hs�sxi�����������t��`f��pt�h����hg��0t�t�t����h]��������������h���xi����������xu ��l��������������uHu�uv8vh]��������������P�ãh]ţ������������(�ȣ�TUW�W(]^d8ipi�j�p�q�qhsuv8v�l�������������������u�u`f��xwhgP�`����K����HC ���i�����h]����������������x����ha����`x��h]����������������x�����vT���������^��������������x�x����Xe����y�tT� ����"�i�������@��_�zz zT�P��y(����xiڣ����xz�(���|�(��|p}�� -@��_��|}��!x� �~ ��|p}�}@��_���N�����`@��_��������������0�@�V�W!H -��~�k�P� -�(:-��83�P�bF:,���z��d� ��~v�= �(�&�(5(����(���������P�p�Ȋh�،��@����� �0����HC �z� ���������HC �zH -���������HC �z� -��������� ����h]��������������(���HC �z �����H� -��Ё(�8�����h]��������������F� -��(�h] �������������(���l���������������������Xe�`�`�������h]��������������0�"�xi&������������ xi%���������Ђ��� h]&�������������@�'�ha����zHC �z�0�'�h]����������������@�����^���������������������Xe������`-�����p� �h]1�������������83�:�xi=������������ h]=�������������P�>�ha-����zHC �z83�>�h]����������������P�����^���������������������Xe����Ѕ`D���������h]H����������������K�xiO������������ xiN���������8���� h]O�������������(�P�haD�P��z83�P�bF:,�0�@�V�W!� ��~v�= �(�&�(5@Y���Ƹ‰ H -��~�k�P� -�(:-�����(�z��dЌ� ����nX;�0��Z�FHC �z���P�h]����������������(�����^�������������p������Xe������`V�����X���h]Z�������������Ќ�f�xii����������łh]i������������� �m�haV�Ȋ�zHC �zЌ�m�h]���������������� �����^�������������h�������Xe������`������P�H�h]��������������X;���xi������������� h]��������������0���ha��،�zHC �zX;��� � �0�����x�h]����������������0�����^���������������������Xe�������z�����|p}�@��_�А������|p}��@��_��Ө����`@��_���������������Е��h] �������������@Y� �h]�������������(��xi����������X[�l�����������������xi������������ `o���������'(�h�`�����8�h�h]����������������ha�@�h�HC �z@Y��h]����������������������^���������������������Xe������c�����(���P��h] ���������������!�xi%���������8�� �p"���������2Е�h]*���������������+�p*����������������Xe*�Ȗ`��������p���������`��zx����|p}��@��_�X�x���!��|p}8�@��_�-�Ө����`@��_����������� T�X�*����p�����Щ���������(���������8�`5�����@���h];������������� T�?�h]B�������������(�F�xiF������������`�lF�����������������P�p�h]R���������������S��lG������������������@�h]S�������������X�T�ha5����HC �� T�T�^��������������������Xe������h]`�������������X�d�xii���������p�/� �pe���������-�@�`���������X���������|p}8�@��_����8����|p}أ@��_�r�h�����`@��_���������ȥ��Щ�h]������������� ���n���������5��`��������H��0���P����|p}p�@��_�0�P�p����|p}�@��_��N�����`@��_���������Щ�h]!�������������P�*�h]-���������������.�xi1���������p�� `o/���������&�@�^+���������Щ������Xe!�Ȫf>����h����hg�Ф�H������eW����h����hg\���ȟ������h]s�������������(�v�xi|���������H�� xi{�������������� �pw���������-��`�`��������0�p�г��8����|p}X�@��_��8�X�ذ�|p}��@��_�������`@��_���������������h]�������������� ���xi����������Pj�^������������������Xe�� �h]�������������(� �h]����������������xi���������(�� `o���������&����^ �����������@�����Xe����h����hgo�����������h]'�������������X�+�xi0�����������.�p,���������-(�`�`��������0�����8����|p}X�@��_��8�X�ظ�|p}��@��_�9������`@��_�������������������h]��������������@���xi���������� �xi����������h����p����������-��8�h]��������������@���h]������������������^������������������Xe��0�h]̧������������0�קxiܧ����������pا��������-��л�nا��������5�h]��������������0���xi������������ ^������������������Xe����h����hgȧX�X�p�����hg��������������p�����Щ���������(���������������h] �������������@��xi���������P�(xi�������������0�p���������-��h��n���������5��`��������h����p����|p}��@��_�P�p�����|p}0�@��_��ͨ����`@��_�����������h]��������������0���xiè��������X�8xi¨������������@^������������p�����Xe�����h����hg��� � �����hg#�����0��������(���������P�p�Ȋh�،��@�����Е�������������� �X�������h]ݨ������������@���xi�����������Hxi����������H���P�p����������-���h]��������������(���xi����������Xxi���������P���`�p����������-�� �`o����������`�h�h]O�������������0�Z�xi_���������P�h�p[���������-�� �`o�����������h�h]��������������0���xi����������P�p�p����������-�� �h]Ω������������@�֩h]۩������������(�ީxi����������H�x`oߩ��������'����pש��������-��`�`o©��������h���h]��������������@���h]��������������P��xi������������`o���������&X����p����������- ���`o�������������`oa�����������X�`�������� ����z(����|p}H�@��_��(�H����|p}��@��_� �$�����`@��_���������xi�������������`f����h����hg٨�������������Ё(�8��������h]0�������������(�4�xi4���������8� ��l4����������������������h];�������������@�C�h]E�������������(�H��l5�����������������P���`f)�0�HC �z�(�����h]����������������������ha�������zh]�����������������������v����������^�������������@�x�����Xe�������t������"�(��zp���@��_���������Hz�*����xiT���������������|p}��@��_�������@� ����|p}`�@��_�k�Z�����`@��_����������H -�h��k�P� -���:-��� � �v�= 8F��������x�H��� ����p���HC �� ���������HC �H -���������HC �� -���������8F�x�v�h]l���������������v�HC �8F������h����h]������������������xi�������������p����������-H���h]�������������������n����������8��xi����������������p����������-(�X��n����������5��`o��������������`����������h�������|p}��@��_�������@��|p}`�@��_���1�����`@��_��������� ��h]˪������������x�Ԫh������@�ު��x�����H�xiު����������h��xiު����������h��h]��������������� ��n���������8�xi �������������xi ��������������H�n������������`oު��������&�� �`o���������&`�x�hmǪ�������� �X������s������������Xe��8��h����hg~��P�������h]=��������������\�D��(�p�xiE���������X�`&�h]J���������������T��l=���������������������`f6���HC �������h]���������������������ha����`��h]����������������������v\���������^���������������������Xe������t\�����"�������@��_��� �\�����,�����j(��������(� z�� �������@���xi`���������������|p}�  @��_�����pz�dH& 0�p��|p}p�@��_�u�`� - ����`@��_���������p������������n�H -�x��k�P� -���:-�� T��*��� �0�v�= ���&�(5����X���P���������� H(P�� ���@�HC (�� ���������HC (�H -���������HC (�� -��������� ���z�h]v���������������z�HC (� �����ؤ#P�h�8�h���h]���������������F�������h]�������������������l������������������X���Xe����`��������x�h]�������������������� ��h� ���xi����������P��H�xi�������������� �h���������xi������������G�xi����������P����� ���������xi������������pI�xi�������������������������xi«��������x�K�xiǫ������������H�����������xi˫��������0�hJ�xiѫ��������x����H�����������h� ����� j����������������h]ԫ��������������իha��P�(�HC (���իh]����������������������^��������������������Xe����(�h]߫����������������xi������������X[�l������������������xi��������������p����������-�P�h]�����������������`f�����h����hg۫���(�����`��������h] ������������� T��h]����������������xi���������X��`�l���������������(�����xi#�����������l�����������������p���h]$��������������%�ha��(�HC (� T�%�h]���������������������^������������� (����Xe����X`+������h]/����������������9�h]=��������������A�xiF����������/��pB���������-H�h]M��������������N�ha+�(�Ќ�����n @Y�Ƹ‰ 83��bF:, �������������n�� �0�v�= ���&�(5H -�x��k�P� -���:-�� T��*��H}���S_�0��V�W!����z��d -HC (����N�h]���������������������^�������������(�����Xe����``T�����h]X�������������H}�]�h]X��������������]�haT�P(�HC (�H}�X�h]g��������������q�`��������pP 8(�x ���|p}� @��_�X -x -� - �|p}8 @��_�s�������`@��_���������� h h]{���������������~�xi~���������` �H�l~�������������� 0 xi����������� `&�^����������x � ����Xe{� h]�����������������xi����������� �^����������h � ����Xe��� ��X���P���������� H(P�� h (X@8��0�(P� 8$�%�&�+,`����������(�����|p}�@��_����H�|p}h@��_���������`@��_���������(h]�����������������xi������������^����������(`����Xe���hgc��(X����`Ĭ������h]Ȭ�������������0�ЬxiԬ����������xiӬ��������@���h]Ԭ�������������լhaĬX(�HC (��0�լ���@��p��� h]���������������������^�������������@����Xe����xP�h�8�h���@hx���$�+�X�`۬�����`h]߬������������83���xi���������� �h]�����������������ha۬8(�HC (�83���h]���������������������^�������������������Xe����`��������h]�������������������xi����������0�xi����������x���h]�����������������ha���(�HC (������h]���������������������^�������������0H����Xe����h`������h]�������������Ќ��xi����������łh]���������������ha��(�HC (�Ќ��h]���������������������^�������������(X����Xe����``!������$h]%�������������@Y�&�h])���������������-�xi-����������X[�l-�������������P�xi7���������@ �`o5���������'� h]7��������������#8�ha!�� (�83��bF:, @Y��#Ƹ‰ ���&�(5 T��*��Ќ�����n �������������n�� �0�v�= �0��V�W!H -�x��k�P� -���:-��H}���S_����z��d -X;�&�Z�F HC (�@Y�8�h]�����������������#����^�������������8$X ����Xe����p$`������ %h'h]��������������X;�ĭxiǭ���������%�h]ǭ������������&ȭha���%(�HC (�X;� ȭp����@��p��� �%h]����������������&����^��������������&`%����Xe����'(�)���|p}0)@��_��)*�[!�*�|p}�*@��_���������`@��_����������-�+,�,�102 34�9�>?�@�F�G�G8I�N�c������(-P,-h]���������������#��h]������������������p����������2�+,h]���������������#��p������������,����Xe���,`��������p-4�@Ip[�'x/���|p}�/@��_�X0x0�R!1�|p}81@��_���������`@��_����������U�102 34�9�>?�@�F�G�G8I�N�OP�Ph]�������������� �h]����������������xi����������2�`�l�������������02h23 3h]��������������#��l������������������2�2^ ����������1X3����Xe��3h],��������������0�xi5����������4/��p1���������-4P4`�������� 5h@�@�-(7���|p}H7@��_�8(8H8�8�|p}�8@��_�>�4�����`@��_����������:�9�>?h]Ӯ�������������߮�nҮ��������5�9`��������X:(@@@�5`<���|p}�<@��_�@=`=�=>�|p} >@��_��������`@��_����������>?h]�����������������h]���������������#��xi�����������?�`o����������&?P?^�����������>�?����Xe���?f -��+�h����hgή�9:X@�����e#��+�h����hg(��4�4�@����h]?��������������B�xiH���������XA�xiG����������A���pC���������-�@pA`��������@B�G�H�-HD���|p}hD@��_�(EHEhE�E�|p}F@��_�K�������`@��_����������F�G�Gh]���������������¯xiů��������Pj�^ï���������FG����Xe��0Gh]ԯ�������������ׯh]گ�������������#ۯxiޯ��������8H`oܯ��������&�GH^د���������GPH����Xeԯ�H�h����hg;��A�A�H����h]�����������������xi�����������I.�p����������-8IpI`��������@J�R�-HL���|p}hL@��_�(MHMhM�M�|p}N@��_��Ͱ����`@��_����������N�OP�P�Qh]^��������������f�xil���������0Oxik���������xO�� �pg���������-�NHOh]y����������������h]���������������#��^�����������OP����Xey�@Ph]��������������&��xi����������Q(�p����������-�P�P�n����������5(Qh]��������������&��xið��������R0^�����������Q�Q����Xe��R�h����hg��hQhR�R����hgZ��O�P�R�����102 34�9�>?�@�F�G�G8I�N�OP�P�Q�SZh]װ�������������߰xi����������`T8xi�����������T��@�p����������-�SxT�n����������5�T`��������xU[�-�W���|p}�W@��_�`X�X�X Y�|p}@Y@��_���������`@��_���������Zh]��������������&��xi����������hZHxi�����������Z��P^����������Z�Z����Xe���Z�h����hgӰU0U0[����hg���I�I@[�����+,�,�102 34�9�>?�@�F�G�G8I�N�OP�P�Q�SZ��X���P���������� H(P�� h (X@8��0�(P� 8$�%�&�+,�,�102 34�9�>?�@�F�G�G8I�N�OP�P�Q�SZ�^�_ab�bcHd�d�j�p�qr�r�sh]�����������������xi����������(_Xxi����������p_��`�p����������-�^@_h]ı�������������DZxiͱ��������0`hxi̱��������x`��p�pȱ��������-�_H``o�����������_�`h]�������������&&�xi+���������xax�p'���������-aHa`oϱ���������`�ah]|�������������&��xi����������xb��p����������-bHbh]�����������������h]�����������������xi����������pc�`o����������'c@c�p����������-�b�c`o�����������b�ch]���������������òh]Ȳ�������������ѲxiԲ���������d�`oҲ��������&�d�d�pIJ��������-Hde`o����������d@e`o-����������a�e`��������Hf@z(�Ph���|p}ph@��_�0iPipi �i�|p}j@��_�ز������`@��_����������l�j�p�qr�r�s�tv�v�w�x�xh]�����������������xi����������8k�xi�����������k����p����������-�jPk�n����������5�k`��������Plz�fXn���|p}xn@��_�8oXoxo �o�|p}p@��_���������`@��_����������p�qr�r�s�tv�v�w�x�xh]����������������xi ���������@q��p���������-�pqh]���������������`o���������Xq�qh]'���������������*�xi*���������xrpI�l*�������������rHrh]2���������������5�xi5���������8shJ�l5��������������rsh]=���������������A�xiA����������s ��lA��������������s�s`t�t�txiH����������t�h]K��������������N��lB�����������������tPt^;���������Psu����^0����������rXu����Xe'��uh]h���������������k�xik���������xvpI�lk�������������vHvh]s���������������v�xiv���������8whJ�lv��������������vwh]~�����������������xi�����������w ��l���������������w�w`x�x�xh]�����������������h]������������������l������������������xPx^|���������Pw�x����^q����������vHy����Xeh��yhg���q�u�y�����h����hg���kl0z������X���P���������� H(P�� h (X@8��0�(P� 8$�%�&�+,�,�102 34�9�>?�@�F�G�G8I�N�OP�P�Q�SZ�^�_ab�bcHd�d�j�p�qr�r�s�tv�v�w�x�xx�8���@�x�p�0�h�0�������З���� ���؜�8�������p�����`���������~����(������|p}�@��_�؁��X�!���|p}��@��_���״����`@��_���������(�x�8���@�x�p�0�h�0�������З����h]���������������³xidz������������pó��������-x���h]̳�������������ֳ`oɳ����������8�`����������X�H�p����|p} �@��_���� ����|p}��@��_�س4�����`@��_�����������@�x�p�0�h�h]������������������xi������������hJ�l������������������h]������������������xi������������ ��l��������������@�x��0�x�xi����������`��h]�����������������l���������������������^�����������������Xe���h]����������������xi���������،pI�l�������������p���h]����������������xi����������� ��l�������������0�h�� �h�xi$���������P��h]'��������������*��l���������������������^�����������������Xe���`������������ؙp�����|p}Б@��_�����ВP��|p}p�@��_�:�������`@��_���������0�������З����h]D���������������G�xiG�����������hJ�lG�������������0�h�h]O���������������S�xiS���������X� ��lS���������������(������h]Z��������������c�h]e��������������m��lT�����������������p���^M�����������P�����XeD���h]x���������������{�xi{���������x�pI�l{��������������H�h]������������������xi����������8� ��l��������������З�������h]�����������������h]������������������l������������������P���^������������0�����Xex���hg��p���`�����h]������������������x�8���@�x�p�0�h�0�������З���� ���؜�xi������������K�l�������������� �`�h]������������������xi����������P� ��l���������������� ���؜�h]´�������������ʴh]̴�������������ϴ�l������������������h���^������������H�����Xe����hg���ef�~����h]�����������������xi��������������p����������08�p�h]������������������xi����������`��G�l����������������0�h]����������������xi��������� � ��l���������������������p�xi ���������ؠ�h]���������������xi���������X��`o���������'��(��l�����������������8�x�^����������x�������Xe���h]+��������������5�h]=���������������@�xi@�����������G�l@�����������������xiG�����������`&�^E���������(�h�����Xe=����h����hg'�p�������hgݴ��X�(�����h]X���������������[�`fQ���@�P�h�8�h���@hx���$�+�X���HC (��� -����h]����������������������ha����8�(�h]�����������������������vg���������^���������������Ȧ����Xe�������tg�����"��(����@��_�������g���X�.����xif�����P��E�xik� ������`&� �h���������xir�#������:](� �V�~�xi}�&������(�بX���������xi��)�������]�xi��,������ȩ���������xi��/�������xi��2������h����������� j5������@����h]���������������ha'�X���HC ��� -��^����������X������Xe������h]��?������������xi��<����Ȭ�]�l��9��������`���h]��L����������xi��I�������]�l��F�������� �X�h]��O��������ŵ^��B��������0^��5�������2Xe��h�h]ǵ\����������̵� � �� ������p�hF�Āh?�PY��X�`� ���Ю��X�H�ȳ��(���xi̵Y����@��l̵V��������Ю�h]յi��������ڵxiڵf������lڵc����������аh]��l������������^��_�����X�4^ӵR����X���6Xeǵ��h]��{����80���platform]0����-��xi��x��������l��u����:H���xi�~����p��]��p�r����-�@�h]����������h��xi������0�� �l����������ȳ�h]!����������&�^������H�������������>Xe/� �hg�����p�o�t ����d��������@��_���0�0�Xe���t������������ ���@��_��������HC ��� �����h]���� �������������^��������X�������h]K��������������`fK���HC ������������HC ��(D���������HC ��H ������������P���.this_function]�H��s�p~�pK��K�L�xM��M�8O�8R��S��T�Z� �� -���ɀ`ɀ�ɀ�ʀ(ˀh̀(πPЀ`р`ր �� -`D��D��D��F��F� I�@M�0��c�Xc��c� f�ph��j�`s��{�X����� ��� -@�� x�� �ς ҂�}��9�@:��:��;��>�B��F��H�J�b� e� -(�� (� HL��L��L��M� Q��U�����z�8{��{������@��`��@��ؤ�0�� �-�0.�x.� 0�h0�7�<�XF��V��i� l� -h|� H�� p�� @�����������P��p3��3�4�5��@��I� �h���������x������������� ��� -��� @@� Ї�H��� �0n�xn��n��o�@p�0w�{�}��~���� ��� -�M�-�X-��-��.��1�@4�8�:�`<��C� ���Ѝ��������Ȥ�����0����� ��x��p��h�� h�� -� �� P� ������P�!�#P%P-�6@o�o�o�pXw|����0�0��X������h����H���������(�8�h� ( -P � � - hN�R@ap�����h�����������������@ ����0�h���P�(� ����� �� -X��~�~((�@�P�(� �0��� �h�����0�x������������ � -� �# & � �x -� ��� �h�0�x����F� pĀ -�?� �\�  ��0�x����� �h�0�x����F� pĀ -�?� �\�  ���0�x��� diff --git a/Chapter03/working-with-files/file.dat b/Chapter03/working-with-files/file.dat deleted file mode 100644 index 69d5e4d78f30ec20d277da1967ba24284e2662b9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1079967 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 zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM c7%*VKfB^#r3>YwAz<>b*1`HT5VBm3J0TD-Po&W#< diff --git a/Chapter03/working-with-files/incremental-processing/clean.dat b/Chapter03/working-with-files/incremental-processing/clean.dat deleted file mode 100644 index 5ff558c..0000000 --- a/Chapter03/working-with-files/incremental-processing/clean.dat +++ /dev/null @@ -1,122 +0,0 @@ -��b�6(�d(�����%(�%(����h]k�������������0��2(��|p}82(P��_��2(3(xc(!�3(�|p}�3(P��_��v�y3(�����������P��_�i���������9((2(h]{�������������|�ha@2( ( (�i|������������������2(����^�������������4(�4(�6(�=(�>((D(`D(XF(G(�L(xR(8S(�S(�V(W(�W(p}05(���_�6(06(�6(p}�6(���_�����h]w������������x��wh] w�������������� wxi w��������85(��l w�������������4(5(�5(�5(xiw���������5(8 �lw����������������P5(�5(A(^w���������4(6(����Xew`6(h])w��������������-wxi-w��������07(��l-w�������������6(7(�7(�7(`�7(xi9w���������7(����@ �l.w����������������H7(�7(�xi@w���������8(:H �p(Hc(X (�"(�0(x2(�8(�B(h]�����������������0(0;(��|p}P;(P��_�<(0<(@b(!�<(�|p}�<(P��_�Iw�y$(�������P��_��������������Y(���������8(p����������� ;(Xe��`���������@(�D(�F(�=(�>((D(`D(XF(G(�L(xR(8S(�S(�V(W(�W(�](�^(`_(�>(?((?(�|�?(��h]Uw��������_���� ��\wxi_w��������>(P ^]w���������=(�=(����XeUw0>(h]pw���������������swxivw��������?(X �ptw��������(0�>(�>(`���������?(@F(�X(�9(�A(��|p}�A(P��_��B(�B(�B( HC(�|p}hC(P��_�ywy]�������P��_���������������H(��l���������������A(������(B(�@(�����������A(h]���������������B(��ha��(D(`D(XF(G(�L(xR(8S(�S(�V(W(�W(h]�����������������B(����^�������������@B(����XeXC(h]�����0(�������������8(h]�w�������������x���wh]�w���������������w����xi�w���������D(��l�w������������`D(�D(0E(PE(�2(��h]xi�w��������(�E(����` �l�w�����������������D( E(����^�w������������(D(�E(����Xe�w�E(h]�w������������x���wxi�w��������(�F(/h �p�w��������(-XF(�F(h]�w������������x���wxi�w��������(�G(\p �p�w��������-G(PG(`o�w���������F(�G(`��������`H(��V(�W(�X(�H(���l������������� H(XH( @(hJ(��|p}�J(P��_�HK(hK(�K(L(�|p}(L(P��_��wy}�������P��_�L(��������pN(�M(p} M(���_�#�������������_������Q(�L(xR(8S(�S(�V(W(�W(�k�P�"pN(:-���P�O(R�q �!�M(v�= �O(V�q$�O(�O(8O(�P(�U(XW(@X(�Y(h]�w����������������wxi�w��������PM(x �p�w��������-�L( M(`���������M(C pV(�V(��������HC �I(H"���������H(�O(��|p}P(P��_��P(�P(Q(�Q(�|p}�Q(P��_��w�xO(�������P��_����������I(��'HP(�Y(�Z(h]�����O(;���������Q(�V(�W(xR(8S(�S(�V(�I(S(��|0S(�S(�T(�|p}���_�h]wx������������0��zxxizx����������R(�����>lzx������������xR(�R(h]�x������������0���xxi�x���������S(�=l�x������������8S(pS(h]�x���������������xxi�x��������`T( Sl�x�������������S(0T(�T(�T(0U(xi�x��������U(� xi�x��������`U(� �l�x����������������xT(�T(i^�x���������S(xU(��������^�x���������R(�U(����Xewx V(h]�x�������������0���x`f�x�V(�h����hg�whM(�M(�V(��������h]�x������������p���xxi�x������������^�x��������W(PW(����Xe�x�W(h]�x������������� ��yxiy��������PX(� ^y���������W( X(����Xe�xhX(�h����hg�w�G(H(�X(��������`��������XY(�a((b(Y(�Y(����`o����������&�X(Y(Xet��9(`[(��|p}�[(P��_�@\(`\(�\(](�|p} ](P��_�%y�y(��������P��_������������������������G(�G(��X[(����������(xi������������l���������������[(\(�](�^(`_(�a(����������(���p����������-H\(�\(�n�����������\(h]����(���(�(�( (p"(�%(h0(@2(�8(�B(h]�y������������0���yxi�y��������(H^(�>l�y�������������](^(h]�y������������0���yxi�y��������_(�=l�y�������������^(�^(h]�y���������������yxi�y����������_( Sl�y������������`_(�_(0`(P`(�`(^������xi�y��������(�`(� xi�y��������(�`(� �l�y�����������������_( `(�� ^�y�������� _(�`(�����^�y��������`^(8a(����Xe�y�a(h]�y������������0���y� `f�y�a(�=(�>((D(`D(XF(G(�L(xR(8S(�S(�V(W(�W(�](�^(`_(�a(�����b(�+l��� ������b(�b(xihglw?(X?(Y(�����4(�4(�6(�=(�>((D(`D(XF(G(�L(xR(8S(�S(�V(W(�W(�](�^(`_(�a(����0d(�+l�� ������c(d(�h����hg%w�8(�8(�d(����8��������������������p�����������������`������������������8�������������������������(��������������8��p��(�`�`��� �x�������X�����0�h��@������,�x-�x.�8/��4(�4(�6(�=(�>((D(`D(XF(G(�L(xR(8S(�S(�V(W(�W(�](�^(`_(�a(l@� ������f(�f(xiJ� �����g(���lJ�� �����@g(�g(^4�� �����f(�g(�Xe�h(h]x� ����������'��xi�� �����h(�+l�h����hgsv�80�x0��h(����royShg�p������i(����إ������ج�x����`��x��8��ر�H��h����� ����������������8��������������������p�����������������`������������������8�������������������������(��������������8��p��(�`�`��� �x�������X�إ������ج�x����`��x��8��ر�H��h����� ����������������8��������������������p�����������������`������������������8�������������������������(��������������8��p��(�`�`��� �x�������X�����0�h��@������,�x-�x.�8/��4(�4(�6(�=(�>((D(`D(XF(G(�L(xR(8S(�S(�V(W(�W(�](�^(`_(�a(�o(xp(Hv(w(�w(@y(�z(H{(|(@}(�(0�(��(@�(��(0�(��((�(P�(��(8�(��(H�(H�(��(��(`�(��(��(��(@�(�(H�(��(X�(0�(h]z������������x�� zxiz������������ p(/� �p -z��������-�o(�o(h]z������������x��zxi"z��������(�p(\� �pz��������-xp(�p(`oz��������8p(�p(`���������q(�(y(xy(����HC �k(p�����x���s(��|p}�s(P��_��t(�t(�t(hu(�|p}�u(P��_�+z�z����������P��_���������h]����������������h]�����q(�������������o(��`��h]����������Hv(w(�w(@y(]�u(�5Ou(h]���������������o(���D&����������r(�D&h]����������������h]����h]�z������������0���zxi�z��������(�v(�>l�z������������Hv(�v(h]�z������������0���z����xi�z��������(pw(�=l�z������������w(@w(h]�z����������������zxi�z����������0x(� l�z��������������w(x(^�z���������w(Hx(����^�z���������v(�x(����Xe�z�x(h]�z������������0���z`f�z@y(�h����hgzQ 8q(xq(�y(����hg�p(��h���y(����������������x����`���y(H~(x~(Ѐ(��(Ј(Ȋ(؍(��(h]�z������������� ���zxi�z�����������z(� �p�z��������(0�z(�z(h]�z������������0���zxi�z���������{(�>l�z������������H{(�{(h]�z���������������zxi�z��������p|(l Sl�z�������������|(@|(�|(�|(@}(�|(xi�z��������(}(����� h]�z������������ ��{Z �l�z�����������������|(�|(^�z���������{(x}(����Xe�z�}(�h����hg�z{( ~(8~(����` {�����~(� ��(h]{�������������0�{xi{���������0(y � xi{��������x(��� h]{�������������({ha {�(x��HC x���0�{h]�����������������(����^�������������0�(H(����Xe�����h�(`"{�����(ȅ(h]&{�������������83�/{xi2{����������(� h]2{��������������(3{ha"{��(x��0�(x�(Є(@�(83���(bF:, ��(X�(0�(h�(Ȝ(�( 6��&�(5@���(Ƹ‰�� �����K �x��*����h��n�0 Ќ���(���np(�!��������؞���2�~�p(H"���������0��(V�W! ��0�������!���v�= ��p���n�H"Ȥ��k�P�"��:-��(�h���`� -���P�(z��d X;��(�Z�F��������HC x��83�3{h]������������������(����^�������������@�(X�(����Xe��������x�(`9{����(�(��(h]={���������������@{xiD{��������(��(� xiC{��������(��(��� h]D{������������P�(E{ha9{��(x��HC x����� E{P)��p�����X��P��H��H���(؁(0�(��(Ќ(��(h]����������������P�(����^�������������0�(��(����Xe����h�(`K{�����(-����(h]O{������������Ќ�[{xi^{��������(��h]^{��������������(b{haK{��(x��HC x��Ќ� -b{h]������������������(����^�������������(�(X�(����Xe����`�(`h{�����(��(h]l{������������@�m{h]p{��������������t{xit{����������(X�lt{������������P�(��(xi~{��������@�(� `o|{��������'Ћ(�(h]~{��������������({hah{��(x��HC x��@� {h]������������������(����^�������������8�(X�(����Xe����p�(`�{���� �(Џ(h]|������������X;� |xi|����������( -h]|�������������(|ha�{��(x��HC x��X;� |h]�����������������(����^�����������������H�(`�(����Xe����������(����x��x�(��|p}��(P��_�X�(x�(�(!�(�|p}8�(P��_�2|��������P��_���������X�(p}��(��(x�(�|p}���_�a�������H�(��(��(`�(��(��(��(@�(�(H�(��(X�(0�(�(8�(��(�c.|������(��(x�(h]5|��������������(6|h]:|������������ ��A|�p7|��������2H�(��(h]E|��������������(F|pE|�����������(����XeE|0�(`������������ؕ(^h�((�(p�(��(��(����Xei�ȕ(h]����������������(��(��|p}�(P��_���(��(X�(!��(�|p}��(P��_�H|�(�������P��_���������-`�(p�(`@�(��(��(H�(��|p}h�(`�(��(��(��(@�(�(H�(��(X�(0�(�(8�(��(0�(8�(p�(�|p}�(���_���������������_�����h]P|������������x��T|h]W|��������������[|xi[|���������(��l[|��������������(К(h�(��(�(h]g|��������������(h|�l\|�����������������(X�(^U|��������`�(��(����XeP|�(h]u|������������x��y|xi~|����������(����/ -�pz|��������-��(��(h]�|������������x���|xi�|��������(��(\ -�p�|��������-@�(x�(`o�|���������(��(`����������(Щ(�(p}�(���_�Р(��(�(��(X�(��(��|p}��(P��_�p�(��(��(0�(�|p}P�(P��_��|�}�������P��_���������@�(�(H�(��(h]������������������(�(Bad argu]�آ( h]0}���������������(<}�n/}��������5�(`����������(�����(��(����`�(Xe����(hg����(��(��(����hgC��(ȥ(��|p}��(P��_���(Ȧ(��(h�(�|p}��(P��_�>}w}(�(�������P��_��(����������(x�(��(��(�(�(@�(p�(h�( -�������������ؤ(Xe -�H�(h]W���������������(H�(��(P���������8��(xi`���������P�(�A��p\�����������( �(`����������(h]J}��������������(S}h]V}��������������(W}xiZ}����������( -`oX}��������&��(��(^T}��������H�(�(����XeJ}@�(fg}��(�h��������hg+}H�(x�(��(�����e�}��(�h����hgq|�(@�(�(����h]�}������������P�(�}xi�}����������( -xi�}���������(��( -�p�}��������-X�(ت(`����������(��(H�(X�(��(��|p}Э(P��_���(��(Ю(P�(�|p}p�(P��_��}E~�����������P��_��(����������������������(h]�����������������l��������0�(^u���������x�(�(����Xep�h�(0�(�(8�(L�h�(��(Ю(����h]���������������)��xi�����������0�l��������������H�(��(��(��(����������x�(h]~���������������(~xi"~������������P`^ ~��������0�(h�(��������Xe~��(h]1~������������P�(4~h]7~���������������(8~xi;~������������(0 -`o9~��������&8�(p�(^5~���������(��(����Xe1~��(�h����hg�}���� �(`�(`�(����h]P~������������x��T~xiY~���������(.8 -�pU~��������-��(ز(`����������(|(�(���_�ص(��(�(��(X�(��(��|p}е(P��_���(��(ж(P�(�|p}p�(P��_�b~*�������P��_���������h�(0�(8�(p�(�(�(h]����������������xi������(l����x�(��(h]�~�������������(�~xi�~��������������(@ -xi�~��������(��(��H -�p�~����������-0�(��(h]�~�������������(�~h]�~��������������(�~� ^�~��������8�(p�(�����Xe�~��(h]�~�������������(xi��������x�(P -�p��������(-�(H�(�n��������5��(h]�������������(xi ��������h�(X -^���������(8�(����Xe��(�h����hg�~к(л(��(����hg�~��(��(��(����`�(��(��(��(@�(�(H�(��(X�(0�(�(8�(��(0�(8�(p�(�(�(`�(h�(�3�@@��O��Y�Xi�xs�H��������������P�� h]4�������������(<xiB��������!Ƚ(` -xiA��������"�(��h -�p=��������$-`�(��(�n=��������%5(�(`����������(+&��(@�&��& '0F'�P'�R'�S'�'��'��'hb(`e(Xh(�k(�y(X�(��(��|p}�(P��_���(��(�(��(�|p}��(P��_�E��������P��_���������h�(h]��������������(�xi�����������(p -xi��������������(��x -^���������h�(��(����Xe��0�(�h����hg0� h�(��(��(����hgL~ �(`�(��(����H�(��(��(`�(��(��(��(@�(�(H�(��(X�(0�(�(8�(��(0�(8�(p�(�(�(`�(h�(8�(�|p}x�(إ������ج�x����`��x��8��ر�H��h����� ����������������8��������������������p�����������������`������������������8�������������������������(��������������8��p��(�`�`��� �x�������X�����0�h��@������,�x-�x.�8/��4(�4(�6(�=(�>((D(`D(XF(G(�L(xR(8S(�S(�V(W(�W(�](�^(`_(�a(�o(xp(Hv(w(�w(@y(�z(H{(|(@}(�(0�(��(@�(��(0�(��((�(P�(��(8�(��(H�(H�(��(��(`�(��(��(��(@�(�(H�(��(X�(0�(�(8�(��(0�(8�(p�(�(�(`�(h�(��(��(��(��(��(��(�(H�(��(��(`�(��(��(X�(H�(��(��(��(H�(8�(p�(��(��(�(��(��(��(��(��(��(��(��(P)@)x)p)0) )X)�)H)8)p)� -)p )0 )h )�) )�))�)h]K�������������8�(O�`����������(X�(0�(��(��|p}�(���_���(��(�(��(�|p}��(���_�Q�x�h]��������������(�����xi�����������(� -xi���������8�(��� -�p���������-��(�(h]!�������������P�($�xi*�����������(� -xi)���������@�(��� -�p%���������-��(�(`o���������P�(X�(h]x��������������(��xi����������@�(� -�p����������-��(�(`o,�����������(X�(h]ـ�������������(������xi����������@�(� -�p����������-��(�(h]���������������(��h]�������������P�(�xi -�����������8�(� -`o���������'��(�(�p���������-��(P�(`o����������X�(��(h]��������������( �h]%���������������(.�xi1�����������(� -`o/���������&H�(��(�p!�����������-�(��(`o �����������(�(`o������������(H�(`���������(^��(������(�(�Xe��(h]��� ��������x���(��|p}8�(P��_���(�(8�( ��(�|p}��(P��_�5� -�(�(�������P��_��(����������(X�(��(�|��(*�����������_�����������(��(`�(��(��(X�(H�(��(��(��(H�(8�(p�(�"H�(:-���!v�= `�( �(��(��(h]A�������������P�(D�xiJ����������(� -xiI���������H�(��� -�pE���������-��(�(�nE���������(5`�(`�������������(�(��(��������HC ��(�"����������( �(��|p}@�(P��_��( �(@�( ��(�|p}��(P��_�M���(�������P��_���������h]�����������)����������(�z����������� �(��(��(h]����������������(��(`�(��(��(X�(H�(��(��(��(H�(8�(p�(���������(H�(�l����������������(��(����(����hg��((�(����h]����h][���������������(d�xii����������(����� -�pe���������-��(��(h]n�������������p��x�`ok��������� �(`�(h]��������������0����xi����������@�(p?l����������������(�(h]��������������0����xi����������(�(h@l�����������������(��(h]����������������������xi������������( Sl��������������X�(��((�(H�(��(h�(h]�������������� ����h]��������������P�(���l��������������������(�(e^�����������(��(����^����������X�(�(����� Xe��`�(h]ˁ������������0��΁xi΁��������0�(� p?l΁��������������(�(h]ց������������0��فxiف����������(� h@lف��������������(��(h]������������������� xi����������(��( Sl��������������H�(��(�(8�(p�(����h]����������������(���h]��������������P�(���l����������(����������(�(^߁���������(��(����^ԁ��������H�(�(����XeˁP�(hgW� ��(��(��(�����h����hg=���(��(��(����`��������p�(����X)P )|�@�(HC ��3��������HC ���x��x�(��|p}��(P��_�X�(x�(P)!�(�|p}8�(P��_��F������������P��_�����������(ҏ�uإh�(����( U&(�(����(����(��&H$��(���(��}6� �P�(�A�������(*� � �3��(��(�(��(��(��(��(��(��(��(��(P)@)x)p)0)������������ ����������������������pN"h]���������������(%�xi*�����������`�(� -�p&���������-��(0�(h]/�������������p��9�`o,���������x�(��(`��������x�(�(��(��(�A�������(*� � pN"��(��b -��(��(��|p}��(P��_�`�(��(��( �(�|p}@�(P��_�;����������P��_���'����������&����������%(������������С.this_function]�P�(�s�`��(��(��(��(��(��(��(��(������@�x�p  -P�����hP0h]E�������������0��H�xiH���������h�(h@lH��������������(8�(h]P���������������T�xiT���������(�( SlT���������������(��(��(��(��(@qh][������������� ��b�h]d��������������(l��lU�����������������@�(��(�^N�����������( �(����XeE�x�(h]w�������������0��z�xiz���������H�(p?lz���������������(�(h]������������������xi�����������( Sl����������������(��(p�(��(��(�רh]�������������� ����h]��������������P�(���l������������������� �(`�(��^����������`�(�(����Xew�X�(`���������(X)8)�.�(/�p/� 1�h1��1�(7���(�(��|p}0�(P��_���(�(0�(��(�|p}��(P��_����֩�������P��_�©��������h�����0��x��h�����`��������H�H�����P���(P)@)x)p)0) )X)X1�X2��3��4��7��\��M� N�P�XP�hj��j�0l�xl�h]��������������0����xi������������(h@l����������������(��(h]����������������‚xi‚���������) Sl‚������������P)�) )@)x)��h]ɂ��������������(҂h]Ԃ�������������(܂�lÂ������������������))��^����������)�)����Xe��)h]��������������0����xi�����������)p?l��������������p)�)h]������������������xi�����������) Sl��������������0)h)) )X)PI�h]����������������(�h]�������������P�( ��l��������������������)�)%�^�����������)�)����Xe���)��(��(�(��(��(��(��(��(��(��(��(P)@)x)p)0) )X)�)H)8)p)����H��������ؤ�hg���(0�(��(����h]�������������0���xi�����������)Al��������������)�)h]&���������������*�xi*�����������) Sl*�������������H)�))8)p)(;�h]1��������������(9�h];�������������P�(>��l+������������������))^$���������)�)����Xe� )hg���(��((�(���� )������������x����`���y(H~(x~(Ѐ(��(Ј(Ȋ(؍(��(h )P)�)p����X�������� ����h]P���������������(Y�xi\��������� )� -�pZ����������0� -)� -)h]e�������������0��h�xih���������� )�=lh�������������p )� )h]o���������������s�xis���������� ) Sls�������������0 )h ) ) )� )@c�xiz����������P )� -h]}���������������(��xi������������ )� -`o����������'h )� )�lt������������������ )� )^m���������� )()����Xee��)h]��������������p����h]��������������0����xi�����������)�=l�������������� )X)h]������������������xi����������H) Sl���������������))�)�))�- xi���������� )� -h]ă������������ ��˃�l���������� ��������`)�)v ^�����������)P)����Xe���)�h����hg���)�))����hgL�0 )�) )����h]ڃ������������0��݃`fӃ�)HC x���� ����h]�����������������)����ha����)x��h]�����������������)�����v�o��������^�������������p)�)����Xe�����)�t�o�����"��x��X���P��_��)�)�)�o�"!0��8)����xi�������!0)�;xi�������x)g)H)��������delimiterG!]��) ���Cxi�������()�);�!]�@)�g;�xi�������)H)�)x)��������xi������)�Sxi������!���)0)��������posix]��!�)�DA"xi������!�)�)xi���������))�������� j�K����!T����h]"�H��������)#�ha��)�HC ��S #�^����D������)`)����Xe����P)`'��) "H�,h]-��������������)2�H�+�j)(�)��)�)xi[������"�)HT�@)HT�|p}�+)P��_� )@)R)C'�6) �)@i))�|p})P��_�t����"�������P��_��"���������c)��"�_�#)��v@�Ƹ‰H")�k�P�"P):-���P%)�s��"�!�)v�= `>��!)N�����"��"`�"��"8!)�!)0#)�#)�$)x+)(6)�))�-)�.)�/)80)7)�7)8)@8)p!)h#)0%)�+)�\#�\#`^#�^#e#�#H#(#HC �)�!��������HC �)H"����HC �)�"����������#��# H�# -��# 0�# ��# �#h�#( )j)h )x")p$)8.)�T)�h)`�#`}������ )$`")h]��������������`>���xi����������$ !)�h]���������������!)��ha}�8!)�)HC �)`>���h]�����������������!)����^��������������!)� )����Xe����")`�������")�$X$)h]���������������_��xi����������$P`h]���������������#)��ha��0#)�)HC �)�_��h]�����������������#)����^��������������#)#)����Xe����$)`�������$)h]�����������������h]��������������P%)��ha���$)�)HC �)����)(')��|p}H')P��_�()(()�N)!�()�|p}�()P��_�̄��&�������P��_����������1)�f&8g&�0&@1&x2&�&P�&Ѕ&�&py&�y&�{&`�&��&�))�-)�.)�/)80)7)�7)8)@8)�=)(>)�>)�>)�@)A)�A)(�&p�&��&��&��&��& '�'�<' ='h]ф������������@�҄h]Մ������������)ބxiބ��������H*)X�lބ�������������))*)xi����������'�*) `o����������'`*)�*)`̈́����p+)�' .)h]��������������P-)��hä́x+)�%)��'0�'�P%)�s�0�'��'л'�_�#)��v@�P-)Ƹ‰�!�)v�= 6�6)&�(5H")�k�P�"P):-����'��'`>��!)N���@�'HC �)@���h]����������������P-)����^��������������-)�*)����Xe�����-)�cȄ�����0)(+)�/)�0)h]��������������P-)��xi����������(�.) xi����������8/)�� �p����������(2�.)/)h]���������������#)��n����������5�/)`o����������P/)�/)h] �������������P-) -�p -����������80)����Xe -�p0)`��������1)�5)�A)�B) I)K)�N)DxG�L�O�R�%) 3)��|p}@3)P��_�4) 4)`K)!�4)�|p}�4)P��_�������������P��_�I����������D)1 ��23x����56P��(� 89X #Xf$;<�%&>�&?Xq&@��'A( (B7)�7)8)@8)�=)(>)�>)�>)�@)A)�A)8B)�B)PI)�I)HJ)�(P�( ��((�( ��(`������5)h]������������� 6�h]��������������6)�ha�(6)�1)HC �) 6�@i)p!)h#)0%)�+)`6)h]*�������������P-)+�xi/���������x7) �p,���������27)H7)h]:��������������6)>�h]A�������������)J�h]K�������������P-)L�lJ�������������8)@8)^?����������7)x8)����Xe:��8)`��������h9)�@)�A)�O�R�\�_cj m�1)p;)��|p}�;)P��_�P<)p<)�<)=)�|p}0=)P��_�Z���|��������P��_��������������6P��78�\"X #:;h�$�%=>�&Xq&@A( (xw(Cp�(��(�=)(>)�>)�>)�@)A)��(��(��(�(P�(��( ��((�( ��(h]h�������������P%)k�h]p���������������,y��pl���������-�=)(>)h]��������������P%)��h]��������������0�,��xi����������@?)�l���������������>)?)�?)�l������������������X?)�?)^�����������>)�?)����Xe�� @)�h����hgd�`>)p@)�@)����h]���������������6)��h]��������������P%)��^�����������@)A)����Xe��8A)hg&��7)9) 9)����h]��������������ȖDžB)8B)h]ȅ�������������6)̅�l�������������������A)B)Xe��pB)h]���������������6)��xi����������HC)X�l���������������B)C)xi����������C) �p���������-`C)�C)`��������pD)�H)�1)xF)��|p}�F)P��_�XG)xG)�G)H)�|p}8H)P��_� �$��������P��_����������e�8.)�h����hg���C)(D)I)����h],��������������!)8�h];��������������6)?�xiB����������I)``o@���������&�I)�I)h]H��������������!)T�`oF���������&J)HJ)^9���������PI)�J)����Xe,��J)h]\��������������#)l�7)�7)8)@8)�=)(>)�>)�>)�@)A)�A)8B)�B)PI)�I)HJ)(K)hL)h]o��������������6)s�xis����������L)��ls�������������hL)�L)8M)XM)xi����������M)( �lt������������������L)(M)xi����������(N)/0 �p����������-�M)�M)^m���������(K)@N)����Xe\��N)�))�-)�.)�/)80)7)�7)8)@8)�=)(>)�>)�>)�@)A)�A)8B)�B)PI)�I)HJ)(K)hL)8!)�!)0#)�#)�$)x+)(6)�))�-)�.)�/)80)7)�7)8)@8)�=)(>)�>)�>)�@)A)�A)8B)�B)PI)�I)HJ)(K)hL)�P)0Q)�Q)h]S��������������!)_�h]b��������������5v�xQ)�Q) T)h]w��������������!)��h]���������������#)��8!)�!)0#)�#)�$)x+)(6)�))�-)�.)�/)80)7)�7)8)@8)�=)(>)�>)�>)�@)A)�A)8B)�B)PI)�I)HJ)(K)hL)�P)0Q)�Q)�Q)U)Z)�[)�\)�b)�n����������5�Q)�lb�����������������0Q)hQ)^`����������P)PT)����XeS��T)h]���������������#)��`���������U)�\)�)�W)��|p}�W)P��_�xX)�X)�X)8Y)�|p}XY)P��_��� ��������P��_���������Z)�[)h]���������������!)̇xi̇���������Z)X�l̇������������Z)PZ)xiև��������[)8 �pԇ��������0�Z)�Z)xi�����������[)`h]���������������!)��`o����������&`[)�[)`f���[)xi���������h\)``f�8\)hg�� [) \)�\)����h]*��������������!)6�xi6���������0])X�l6��������������\)])xi@����������])@ �p>���������0H])�])`��������X^)c)�)``)��|p}�`)P��_�@a)`a)�a)b)�|p} b)P��_�C�e��������P��_����������b)h]R��������������!)^�`fK��b)`��������xc)Hh)�)�e)��|p}�e)P��_�`f)�f)�f) g)�|p}@g)P��_�k����������P��_���������xiz���������0h)(2�`fs�h)hg&��])^)0c)����hg��U)HU)`h)����HC �)HT����h]�����������������h)����ha����i)�)h]�����������������h)�����vd���������^�������������`i)�i)����Xe�����i)�td������"HT�) )�P��_��j)�j)�j)d�p)(j)����xi������� k)x5���l)x5��|p}�l)P��_��m)�m)�)!`n)@o)��)�|p}�n)P��_������������P��_�����������Xw)�n�H"�o)�k�P�"�o):-�����|)���~�!@o)v�= 6�p)&�(5�p)�p)hq)�q)xr)�t)w)�x)�y)�{)�|)�|)P})�})�~)�)��)��)8w)�{)HC 8k)�!��������HC 8k)H"��������HC 8k)�"�������� 6�p)��h]���������������p)��HC 8k) 6����H�) -`r)0t)`t)x)�~)��)ȅ)h]��������������Ȗˆ�q)�q)h]È�������������p)Lj�l������������������hq)�q)Xe��r)h]ӈ�������������p)׈xi׈���������r)X�l׈������������xr)�r)xi����������hs)H �p߈��������-�r)8s)xi�����������s)(2�`f���s)�h����hgψ�s)t) t)����`�������t)�w)h]��������������� �h]��������������p)�xi���������Pu)��l��������������t) u)�u)�u)xi ���������v)P �l�����������������hu)�u)xi'����������v)/X �p#���������- v)xv)h]'�������������Xw))�ha��w)8k)HC 8k)��)�^�������������w)�v)����Xe�����w)`4�����Px)�|)h]:����������������K�h]N��������������p)R�xiR����������x)��lR��������������x)�x)`y)�z)h]^��������������p)b�xib����������y)X�lb��������������y)�y)xil���������pz)` `oj���������'z)@z)�lS�����������������y)Py)xis���������P{)/h �po���������-�z) {)h]s�������������|)u�ha4��{)8k)HC 8k)���u�^��������������{)h{)����Xe����H|)h]���������������p)��h]���������������5��0})P})�})h]���������������p)��h]��������������Xw)ȉ�n����������5�})�l�������������������|) })^�����������|)�})����Xe��H~)h]ԉ�������������p)؉xi؉��������)X�l؉�������������~)�~)xi�����������)p �p����������-0)p)h]��������������Xw)���n����������5�)`o�����������)0�)h]���������������p)�xi����������)(2�^�����������)؀)����Xe�� �)�h����hgЉ`�)p�)��)����h]��������������p)��p)hq)�q)xr)�t)w)�x)�y)�{)�|)�|)P})�})�~)�)��)ȁ)�)��)��)x�)Ї)xi���������8�)X�l�������������ȁ)�)xi�����������)x �p���������0P�)��)h]#�������������|)4�`o ���������؃)�)h]<��������������p)@�xiD�����������)`^A������������)Ȅ)`�)����`oB���������&��)Ȅ)Xe<��)�h����hg �P�)��)��)����h]R�������������Xw)\�xik���������`�)`h]q��������������p)u�`oo���������&0�)x�)`fd���)�h����hgN���)��)�)����p�)`r)0t)`t)x)�~)��)ȅ)�)�)h]���������������p)��`f{�Ї)HC 8k)x5�����h]���������������� �)����ha����h�)8k)h]���������������� �)�����v����������^���������������)��)����Xe���� �)�t�������"x5�8k)q)�P��_��)�)(�)���j)��)����xi���������)��� �)���|p}@�)P��_��) �)@�)��)��)�)�|p}��)P��_�����������P��_���������H"��)�k�P�"0�):-���!��)v�= 60�)&�(50�)��)Ȑ)0�)ؑ) �)�)HC ��)�!��������HC ��)H"��������HC ��)�"�������� 6��)��h]��������������0�)��HC ��) 6������)��)��)x�)h]��������������ȖNJ�)0�)h]Ȋ������������0�)̊�l������������������Ȑ)�)Xe��h�)h]ڊ������������0�)ފxiފ��������@�)X�lފ������������ؑ)�)xi����������Ȓ)� �p����������0X�)��)h]��������������0�)��xi������������)��l�������������� �)X�)��)�)xi����������@�)� �l��������������������)��)xi�����������)/� �p���������-X�)��)`o������������)��)`fӊ8�)HC ��)������h]������������������)����ha����ؕ)��)h]������������������)�����v����������^�������������0�)h�)����Xe������)�t�������"����)x�)�P��_���)��)��)��P�)��)����xi��������)pv����)pv��|p}��)P��_�p�)��)�)!0�)�)��)X�)�|p}P�)P��_�)����������P��_���������Р)@��)Ƹ‰H"X�)�k�P�"��):-��p��h�)�̙�!�)v�= �~���)v]�i��)(�)��)�)H�)8�)p�)p�)`�)��)��)P�)��)`�)x�)��)��)`�)��)H�)HC �)�!��������HC �)H"����HC �)�"��������x�)P�)p�)��)��)8�)��)h]6�������������X�)?�xi?��������� �)X�l?���������������)��)xiK�����������)� �pG���������-8�)x�)xi[���������0�)(2�`fT��)�h����hg2���)H�)`�)����`d�������)h]h��������������~�n�h]h���������������)n�had�(�)�)HC �)�~�h��)X�)��|p}x�)P��_�8�)X�)x�)��)�|p}�)P��_�x�e��������P��_���������Щ)H�)8�)p�)p�)`�)��)��)P�)��)`�)x�)��)(�)`�)�)��)h]}�������������@�~�xi����������@�)� `y�������)Ц)h]���������������)��hay���)Р)HC �)@���h]�����������������)����^�������������H�)�)����Xe������)�ct������)X�)0�)��)h]���������������)��h]��������������X�)��xi����������ا)X�l��������������p�)��)�p����������/8�)��)h]���������������)��p�����������p�)����Xe����)`��������P�)ح)H�)��)Р)X�)��|p}x�)P��_�8�)X�)x�) ��)�|p}�)P��_���e��������P��_���������p�)`�)��)��)P�)��)`�)x�)��)(�)`�)�)��)`������ �)8�)h]��������������p����h]��������������X�)��h]���������������)��l��������������`�)��)h]��������������h�)��ha���)Щ)HC �)p����h]����������������h�)����^���������������)Ю)����Xe������)h]ŋ������������Ȗϋ��)��)h]Ћ������������h�)Ӌ�lŋ����������������P�)��)Xeŋ��)h]��������������h�)��xi����������ȱ)X�l��������������`�)��)xi����������P�)� �p����������0��) �)`����������)��)Щ)��)��|p}�)P��_�ص)��)�)��)�|p}��)P��_���_��������P��_���������x�)��)(�)`�)�)��)h]����������������)�h] ���������������,��p���������-x�)��)h]���������������)$�h]'�������������h�)*�^%���������(�)`�)����Xe���)h]C���������������)I�xiM���������h�)`h]S�������������h�)V�`oQ���������&8�)��)^J�����������)��)H�)����`oK���������&�)��)XeC���)hg����)��)��)�����h����hg܋h�)��)к)������)(�)��)�)H�)8�)p�)p�)`�)��)��)P�)��)`�)x�)��)(�)`�)�)��)�)P�)h�)X�)h]n���������������)t�h]y���������������,���pu���������-�)P�)xi������������)(2�`f��ȼ)�h����hgj���)�)(�)����h]����������������,��xi����������н)x5�l��������������h�)��)8�)X�)h]����������������)���l��������������������)(�)`f����)HC �)pv�����h]�����������������)����ha����H�)�)h]�����������������)�����v���������^���������������)ؿ)����Xe�����)�t������"pv��)h�)�P��_���)��)�)���)h�) ����xiÌ�����`�)h)���)h)��|p}�* P��_���)�)�[*�z�N* ��)(�*�|p}��)P��_�ތr� �������P��_����������~*�/���)潳�PE���)~���H"�)�k�P�"H�):-��(U�fA���!��)v�= H/���)v ���)��)�)H�)`�)��)p�)��)��)��)��)�)��)��)(�)�)�)H�)p�)�)�)�)�0h��X6�T�5�@H��v��)��.�{�(j�)����x���)8k)��)�)x�)h�*`�*��*�z+�+(�+HC x�)�!��������HC x�)H"��������HC x�)�"��������H/��)���/�H�)��h]ߌ��������������)��h]����������������)��HC x�)H/�����HC x�)�/������ *#X�)h�)��)��)��)0�)`�)h]��������������Ȗ����)��)h]����������������)���l������������������`�)��)Xe���)h]�������������Ȗ���)��)h]���������������)��l�����������������p�)��)Xe��)h]���������������)"�h]'���������������))��p#���������-��)��)xi8���������`�)�`f1�0�)�h����hg���)x�)��)����h]A���������������)E�h]H���������������,M�xiM���������p�)HTlM��������������)@�)��)��)h]V���������������)Z��lN�������������������)��)^F�����������)0�)����XeA���)h]a���������������)c�h]f���������������,k�xik�����������)HTlk�������������(�)`�)��)�)h]t���������������)v��ll�������������������)��)^d�����������)P�)����Xea���)h]����������������)��h]����������������)���p����������-�)H�)xi������������)�`f����)�h����hg~���)�) �)����`ɍ������)`�)h]͍������������PE�֍�)H�)`�)��)p�)��)��)��)��)�)��)��)(�)�)�)H�)8�)��)��)�)�)x�)h�)�)��)��) �)X�)��)p�)��)��)��)xiٍ�������� �)� h]ٍ��������������)ڍhaɍ8�)x�)HC x�)PE�ڍh]������������������)����^���������������)��)����Xe�����)x�)�)��|p}(�)P��_���)�)(�)��)�|p}��)P��_���U��������P��_���������p�)��)�)�)x�)h�)�c��������)��)��)h]����������������)��h]����������������)��xi����������x�)X�l���������������)H�)�p����������/��)��)h]���������������) �p�����������)����Xe�H�)`����������)��)��)��)��|p}�)P��_���)��)�)��)�|p}��)P��_� �U��������P��_���������x�)h�)h]���������������)�xi�����������)��l�������������x�)��)H�)h�)h])���������������)2��l�������������������)8�)xi8���������(�)/� �p4���������-��)��)�n4���������5@�)fI���)�h����hg���)��)��)����X�)h�)��)��)��)0�)`�)��)��)��)�)0�)��)��)*8*`Z�������)��)h]^�������������(U�e�h]h���������������)l�xil�����������)X�ll��������������)P�)h]m���������������)s�haZ���)x�)�z�h�)��� X�P*���7 ����ˈ: �/���)潳�(U���)fA���!��)v�= H/���)v �H"�)�k�P�"H�):-��k�8�)J��،�(*�(�A -PE���)~���h�(�)N��HC x�)(U�s�h]������������������)����^���������������)��)����Xe����0�)`y�������)��)h]}�������������h���h]����������������)��h]����������������)��`o����������' �)X�)h]��������������(�)��hay���)x�)HC x�)h���h]����������������(�)����^�������������p�)��)����Xe������)`ǎ����X�)�)h]ˎ������������k�ҎxiՎ����������)� h]Վ������������8�)֎haǎ��)x�)HC x�)k�֎h]����������������8�)����^���������������)��)����Xe������)x�)��)��|p}��)P��_���)��)��)P�)�|p}p�)P��_���G��������P��_����������)��)��)��) �)�)�c܎����P�)x�)8�)h]��������������8�)��h]����������������)��xi���������� �)X�l����������������)��)�p����������/��)8�)h]��������������8�)�p�������������)����Xe����)`����������)��)(�)��)��|p}��)P��_���)��)��)@�)�|p}`�)P��_��G��������P��_��������� �)�)h]���������������)�xi�����������)��l������������� �)X�)��)�)h]�������������8�)$��l�������������������)��)xi*�����������)/� �p&���������-H�)��)�n&���������5��)f;�0�)�h����hg �(�)X�)p�)�����)H�)`�)��)p�)��)��)��)��)�)��)��)(�)�)�)H�)8�)��)��)�)�)x�)h�)�)��)��) �)X�)��)p�)��)��)��)��)��) �)�)P�)�)��) �)X�)��)p*�*�*H*�*�*�*P*�*` -* *N*hR**P*�*0*h*�*�*0"* #*X#*�)*`L������)��)h]P��������������z�U�h]X���������������)Z�xiZ�����������)X�lZ�������������P�)��)h][�������������h�)a�haL��)x�)HC x�)�z�a�p�)�)�)�)H�)*0*�*� -*h]����������������h�)����^���������������)��)����Xe����0�)`g�������)�*h]k�������������،�p�h]t�������������h�)y�h]|�������������8�)��`oz���������' �)X�)h]��������������(*��hag���)x�)HC x�)،���h]����������������(*����^�������������p*��)����Xe�����*`ʏ����X* *h]Ώ������������X�ԏh]؏������������(�)ߏh]��������������(*���p����������/�*�*h]��������������(�)��h]��������������(*��r؏��������*H*�*h]��������������P*��haʏ�*x�)HC x�)X���h]����������������P*����^��������������*�*����Xe�����*`������*x *h]�����������������xi����������*� xi���������8*��� h]��������������*�ha�P*x�)���R*�~���hN*��<X�P*���7 �/���)潳�(U���)fA��@�� -*Ƹ‰ k�8�)J��h�(�)N������*�ˈ: H��@a*�GpB�!��)v�= H/���)v �،�(*�(�A -H"�)�k�P�"H�):-���z�h�)��� PE���)~���HC x�)����h]�����������������*����^��������������**����Xe����( *`������ *� *h] �������������@�!�xi$���������H -*� h]$�������������� -*%�ha�` -*x�)HC x�)@�%�h]����������������� -*����^������������� * -*����Xe����8 *��*X�)h�)��)��)��)0�)`�)��)��)��)�)0�)��)��)*8*� *�*`*h*x�*x�)H*��|p}h*P��_�(*H*�Y*C'�*�|p}*P��_�/�ʔ�������P��_���������(**P*�*0*h*�*�*0"* #*X#*�)*p**�**,*�1*�2*�c+�����`*�*H*h]2�������������� -*3�h]7�������������P*=��p4���������1*P*h]A�������������� -*B�pA�����������*����XeA�*`���������*`K*�K*�O*�X*� *�*��|p}�*P��_��*�*�T*C$P*�|p}p*P��_�D�ʔ�������P��_����������*0*h*�*�*0"* #*X#*�)*p**�**,*�1*�2*�2*(4*`4*h]P�������������� -*Q�h]V�������������P*\��pR���������-0*h*`��������(*J*0J*(*0*��|p}P*P��_�*0*�H*!�*�|p}�*P��_�^����������P��_����������5*�*�*0"* #*X#*�)*p**�**,*�1*�2*�2*(4*`4*�9*�:*h]l�������������(*q�h]t�������������P*z��pr���������0�*�*`���������*�3*�*�*��|p}�*P��_�� *� *� * -P!*�|p}p!*P��_�|�)��������P��_����������-*0"* #*X#*�)*p**�**,*�1*�2*�2*h]����������������)��xi�����������"*��l��������������0"*h"*#*�#*h]��������������8�)��h]��������������� -*��`o����������& #*X#*�l�������������������"*�"*xi����������X$*/� �p����������-�#*($*`���������$*,*(*'*��|p} '*P��_��'*(* (*�(*�|p}�(*P��_���t��������P��_����������)*p**�**h]N���������������)P�xiP����������)* SlP��������������)*�)*P**h+*h]W�������������8�)^�h]a�������������� -*b�`o_���������&p**�**xie���������P+*� `oc���������&�** +*�lQ�����������������**@**`fG��+*h]~�������������� -*�xi�����������,*� �p����������-,*P,*`�������� -*�3*(*(/*��|p}H/*P��_�0*(0*H0*�0*�|p}�0*P��_�����������P��_����������1*�2*�2*h]����������������)��xi����������2* Sl���������������1*�1*x2*3*h]�������������8�) �h]�������������� -*�`o���������&�2*�2*�l�����������������(2*h2*`f��H3*�h����hgz��,*�,*�3*����hg��p$*�$*�3*����h]3�������������(�):�h]=�������������P*C��p;���������0(4*`4*`�������� 5*�H*�*(7*��|p}H7*P��_�8*(8*H8*�8*�|p}�8*P��_�E�ۓ�������P��_���������XC*�9*�:*�:*�@*0A*�A*`G*h]U���������������)Y�xiY���������:*��lY��������������9*�9*x:*;*h]e���������������)n�h]q�������������� -*r�`oo���������&�:*�:*�lZ�����������������(:*h:*xix����������;*/ �pt���������-H;*�;*`��������p<*�A*�5*x>*��|p}�>*P��_�X?*x?*�?*@*�|p}8@*P��_���2��������P��_����������@*0A*h]��������������*!�h]$�������������� -*%�^"����������@*0A*����Xe�hA*h]<�������������� -*=�xiB���������8B* �p>���������-�A*B*`���������B*0H*�5*�D*��|p}E*P��_��E*�E*F*�F*�|p}�F*P��_�E�ѓ�������P��_���������`G*h]���������������*��xiÓ���������G* ^����������`G*�G*����Xe���G*�h����hg8�PB*�B*HH*����hgQ��;*(<*XH*�����*�*0"* #*X#*�)*p**�**,*�1*�2*�2*(4*`4*�9*�:*�:*�@*0A*�A*`G*�h����hg/��4*�4*�I*����hgh� *`*�I*����f���*0*h*�*�*0"* #*X#*�)*p**�**,*�1*�2*�2*(4*`4*�9*�:*�:*�@*0A*�A*`G*L*M*@M*HO*pP*`Q*�Q*S*�S*�S*�h����hgL��*�*PK*����`�������K*�O*h]�����������������h]���������������) �xi ����������L*��l �������������L*PL*�L*xM*h]���������������)!�h]$�������������� -*%�`o"���������&M*@M*�l ������������������L*�L*h]%�������������hN*&�ha��N*(*HC x�)�� &�(�*p�)�)�)�)H�)*0*�*� -*HN*�R* a*h]����������������hN*����^�������������HO*�M*����Xe�����O*`.�����0P*�S*h]2���������������8�h];���������������)=�xi=����������P*��l=�������������pP*�P*@Q*�Q*h]I�������������8�)P�h]S�������������� -*T�`oQ���������&`Q*�Q*�l>������������������P*0Q*h]T��������������R*U�ha.�hR*(*HC x�)�� -U�h]�����������������R*����^�������������S*R*����Xe����@S*h]a�������������hN*i�h]n��������������R*t��pj���������-�S*�S*�nj���������5T*f~��*h]��������������hN*��0*h*�*�*0"* #*X#*�)*p**�**,*�1*�2*�2*(4*`4*�9*�:*�:*�@*0A*�A*`G*L*M*@M*HO*pP*`Q*�Q*S*�S*�S*�T*xW*�W*xi���������� W*/ �p����������-�T*�V*h]���������������*��h]”������������� -*Ô^����������xW*�W*����Xe���W*�h����hg��8W*8X*PX*����hg]�XT*�T*`X*����*P*�*0*h*�*�*0"* #*X#*�)*p**�**,*�1*�2*�2*(4*`4*�9*�:*�:*�@*0A*�A*`G*L*M*@M*HO*pP*`Q*�Q**P*�*0*h*�*�*0"* #*X#*�)*p**�**,*�1*�2*�2*(4*`4*�9*�:*�:*�@*0A*�A*`G*L*M*@M*HO*pP*`Q*�Q*S*�S*�S*�T*xW*�W*�)H�)`�)��)p�)��)��)��)��)�)��)��)(�)�)�)H�)8�)��)��)�)�)x�)h�)�)��)��) �)X�)��)p�)��)��)��)��)��) �)�)P�)�)��) �)X�)��)p*�*�*H*�*�*�*P*�*` -* *N*hR**P*�*0*h*�*�*0"* #*X#*�)*p**�**,*�1*�2*�2*(4*`4*�9*�:*�:*�@*0A*�A*`G*L*M*@M*HO*pP*`Q*�Q*S*�S*�S*�T*xW*�W*�`*�a*8f*pf*�f*`h*�h*i*xn*�n*(o*p*@v*�w*�x*Hz*�{*�{*�|*�|*��* �*�*��*�*��*Ї*`Д����``*b*h]Ԕ������������H��הxiڔ���������`*�h]ڔ������������@a*ܔhaД�`*x�)HC x�)H�� ܔh]����������������@a*����^��������������a*�`*����Xe�����a*x�)�c*��|p}�c*P��_��d*�d*�d* Xe*�|p}xe*P��_�D�!��������P��_���������pj*8f*pf*�f*`h*�h*i*xn*�n*(o*p*@v*�w*�x*h]E�������������� -*F�h]I���������������)R�h]U��������������*b�`oS���������&pf*�f*xie���������Pg* `oc���������&�f* g*^G���������8f*hg*����XeE��g*�c@������i*�g*�h*�i*h]h�������������� -*i�h]m���������������)t��pj���������1`h*�h*h]x�������������� -*y�px����������i*����Xex�Hi*`���������i*z*0b*�k*��|p}l*P��_��l*�l*m*�m*�|p}�m*P��_�{�!��������P��_���������8r*xn*�n*(o*p*@v*�w*�x*h]��������������� -*��h]����������������)���p����������-xn*�n*h]����������������)��xi�����������o*��l��������������(o*`o*�o*p*h]��������������� -*���l�������������������o*�o*xi�����������p*/( �p����������-Pp*�p*`o�����������n*�p*`���������q*�y*pj*�s*��|p}�s*P��_��t*�t*�t*`u*�|p}�u*P��_�����������P��_���������@v*�w*�x*h]ƕ������������@a*ɕxiɕ���������v*X�lɕ������������@v*xv*xiՕ��������0w*0 �pѕ��������-�v*w*h]��������������@a*��xi�����������w*a^������������w*�w*Xx*����`o����������&�w*�w*Xe��x*h]�������������@a* �xi ���������y*^ -�����������x*�x*�y*����`o ���������&�x*�x*Xe�0y*hg•Hw*�x*�y*�����h����hg��0q*pq*z*����h]��������������@a*��xi�����������z*X�l��������������Hz*�z*xi����������8{*8 �p����������0�z*{*h]��������������@a*��h]����������������)��xi����������0|* Sl���������������{*|*�|*(}*h]Ö������������8�)ʖh]͖�������������*ږ`o˖��������&�|*�|*�l������������������H|*�|*`o����������&�{*h}*`f���}*`��������`~*��*��*`�*x�)h�*��|p}��*P��_�H�*h�*��*�*�|p}(�*P��_���n��������P��_�����������* �*�*��*�*��*Ї*h]��������������8�)��h]���������������*�^�������������* �*��*����`o����������&��* �*Xe��X�*h]���������������)�xi���������h�*��l��������������*8�*Є*��*h] �������������8�)'��l�������������������*��*xi-�����������*/@ �p)���������-(�*��*h]@�������������8�)G�p@�����������*����Xe>�@�*�h����hg�ȅ*��*��*����h]V���������������)X�xiX���������H�* SlX���������������*�*��*Ї*h]_�������������8�)f��lY�����������������`�*��*`fO��*hg��P{*~*~*����HC x�)h)� ����h]������������������*����ha������*x�)h]������������������*�����v͌��������^�������������H�*��*����Xe������*�t͌�����"h)�x�)�)�P��_���*��*��*͌0�)�*"�����j)(�)��)�)��*��*(�* z+��+xix������P�*X.����*X.��|p}�*P��_�Ѝ*��*�*��*p�*h�*�|p}��*P��_������������P��_���������H"��*�k�P�"�*:-���!p�*v�= 6�*&�(5�*Ȑ*��*h�*HC h�*�!��������HC h�*H"��������HC h�*�"�������� 6Ȑ*��h]���������������*��HC h�* 6����X�*8�*Б*h]���������������*��`f����*HC h�*X.�����h]������������������*����ha����0�*h�*h]������������������*�����v����������^���������������*��*����Xe������*�t������"X.�h�*H�*�P��_���*��*��*�� �*P�*$����xi������H�*�z����*�z��|p}�* P��_�Ȗ*��*8�*!!��* h�*��*�|p}��*P��_�їD��������P��_���������x�*���z��dH"��*�k�P�"��*:-�� ���**��8�*��*��I�!h�*v�= 6��*&�(5��*��*��*��*��*�*��*@�*��*`�*�*��*ئ*0�*Ш*P�*��*؟*��*��*h�*HC `�*�!��������HC `�*H"��������HC `�*�"�������� 6��*֗h]җ��������������*֗HC `�* 6������* ��*X�*��*��*��*x�*ذ*h]ޗ������������Ȗ��ؚ*��*h]����������������*���lޗ������������������*Ț*Xeޗ0�*h]����������������*��xi�����������*X�l����������������*؛*xi�����������*H �p���������- �*`�*xi����������*(2�`f���*�h����hg����*0�*H�*����`!�����Н*Ƞ*h]%������������� �)�h],���������������*0�xi0���������x�*��l0��������������*H�*��*�*xi<���������0�*P �l1�������������������*О*h]=���������������*>�ha!���*`�*HC `�* �>�h]������������������*����^�������������@�*H�*����Xe����x�*`D�����(�*��*hasRoot]�0�*��Ih]H�������������8�*O�h]S���������������*W�xi\����������*/X �pX���������-��*ء*h]c���������������*d�haD�`�*`�*HC `�*8�*d�h]������������������*����^��������������* �*����Xe����8�*`j�������*`�*h]n����������������q�xiu���������X�*` xit�����������*��h h]u���������������*v�haj���*`�*8�*��*��I�!h�*v�= 6��*&�(5@���*Ƹ‰�����*z��dH"��*�k�P�"��*:-�� ���**��Ќ���*���nHC `�*���v�h]������������������*����^�������������ئ*p�*����Xe�����*`|�������*X�*h]��������������Ќ���xi������������h]����������������*��ha|�0�*`�*HC `�*Ќ���h]������������������*����^�������������Ш*�*����Xe�����*`�*�*��|p} �*P��_���*�* �* ��*�|p}��*P��_������������P��_���������H�*��*8�*(�*��*P�*��*x�*p�*�*8�*p�*8�*h]��������������@���h]����������������*��xi���������� �*X�l����������������*��*xi������������*p `o����������'8�*x�*`������H�*��*h]����������������*��ha��P�*x�*HC `�*@�����*؟*��*��*h�*��*h]������������������*����^�������������8�*��*����Xe����p�*�c��������*�*��*h�*h]����������������*��xi������������*x �p����������2(�*`�*h]����������������*˜p�������������*����Xe�� �*`��������Ȳ*X�*�*x�*д*��|p}��*P��_���*е*��*p�*�|p}��*P��_�Ę���������P��_���������0�*P�*��*x�*p�*�*8�*p�*8�*h]̘��������������*Иh]Ә��������������*טxiט����������*��lט��������������*��*X�*x�*h]����������������*���lؘ�����������������*H�*^ј��������P�*��*����Xe̘�*h]����������������*��xi����������ع*/� �p����������-p�*��*`��������x�*8�*H�*��*��|p}��*P��_�`�*��*��* �*�|p}@�*P��_��W��������P��_���������0�*�*8�*p�*h]���������������*��n���������5�*`����������*��*�*��*��*��|p}��*P��_���*��*��*X�*�|p}x�*P��_� �O��������P��_���������8�*p�*h],���������������*/�h]2���������������*3�^0���������8�*p�*����Xe,���*f?�ذ*�h����hg �8�*h�*(�*����`����������*��*H�*��*��|p}��*P��_���*��*��*X�*�|p}x�*P��_�]����������P��_���������8�*h]����������������*��xi����������P`^����������8�*p�*����Xe����*hg����*0�*h�*������*��*��*��*�*��*@�*��*`�*�*��*ئ*0�*Ш*P�*��*8�*(�*��*P�*��*x�*p�*�*8�*p�*8�*@�*H�*0�*h�*@�*x�*h]Ù��������������*ƙxi̙����������*� xi˙����������*��� �pǙ��������-@�*��*h]ܙ��������������*��xi������������*`xi������������*(2�rܙ��������H�*��*��*`fՙ�*�h����hg���*P�*h�*����p�*��*X�*��*��*��*x�*ذ*x�*�*�*h]����������������*�h]���������������*�xi �����������*� �p���������-h�*��*`o���������0�*��*//] �h�*��sxi�����������*p�*`f���*�h����hg��(�*��*�*����h]-���������������*1�xi1�����������* Sl1�������������@�*x�*�*0�*x�*xi8���������`�*� h];���������������*>��l2�������������������*�*`f&���*HC `�*�z�����h]���������������� �*����ha����h�*`�*h]���������������� �*�����v����������^���������������*��*����Xe���� �*�t������"�z�`�*@�*�P��_��*�*(�*���*��*&����xiJ� ������*�i�� �*�i��|p}��* P��_��* �*�I+C<0�* ��*�x+�|p}��*P��_�e�ԣ�������P��_����������+�L+A��*v:�H"��*�k�P�"0�*:-��H�P�*�S_���z��d�!��*v�= 6h�*&�(5h�*��*��*0�*H�*��*(�*��*�*��*��*��*P�*p�*��*h�*��*0�*0�*��*�*��*HC ��*�!��������HC ��*H"��������HC ��*�"�������� 6��*j�A0�*o�h]f�������������h�*j�h]l���������������*o�HC ��* 6����HC ��*A�����*hy+��*�*(�*8�*�*�*�w+h]{���������������*~�h]����������������,���p���������-H�*��*�n���������5��*h]����������������*���n����������8(�*xi������������*`7�p����������-`�*��*�n����������5��*`o������������*�*h]��������������x�,š��*��*xiÚ�������� �*�s�hm������������*��*�����s����������8�*Xe����*�h����hgw�H�*��*��*����h]��������������Ȗ��`�*��*h]��������������h�*���l�������������������*P�*Xe����*`�����p�* �*h]�������������H� �xi�����������*� h]�������������P�*�ha���*��*HC ��*H��h]����������������P�*����^���������������*��*����Xe������*`�������*��*h]�����������������xi �����������*� xi���������8�*��� h] �������������(�*!�ha�P�*��*P����**&{� -A��*v:��!��*v�= 6h�*&�(5@���*Ƹ‰H"��*�k�P�"0�*:-��H�P�*�S_���(�*z��dЌ� �*���n�����*F��� HC ��*���!�h]����������������(�*����^�������������p�*�*����Xe������*`'�����X�*��*h]+�������������Ќ�7�xi:�����������h]:������������� �*>�ha'���*��*HC ��*Ќ�>�h]���������������� �*����^�������������h�*��*����Xe������*`D�����P�*h]H�������������@�I�h]H���������������*I�haD���*��*HC ��*@�H�h]T���������������*W�h]\���������������,e���*0�*H�*��*(�*��*�*��*��*��*P�*p�*��*h�*��*0�*h�*�*��*`�*��*0�*p�*0�*0�*h�*H�*x�*��*�+�+�+x+�pX���������-0�*h�*�nX���������5��*h]i���������������*l�xil�����������*X�ll��������������*P�*xiv����������*� �pt���������0��*��*`of�����������* �*h]{���������������*~�xi~����������*X�l~���������������*��*h]��������������h�*��xi������������*X�l��������������`�*��*�p����������1 �*��*`ox���������`�* �*`����������*��*��*�*h+�G+�I+��*��*��|p}�*P��_���*��*`E+!��*�|p}��*P��_���`��������P��_����������+p�*0�*0�*h�*H�*x�*��*�+�+�+x+�B+�B+HC+�C+ D+h]����������������*��xi������������*X�l��������������p�*��*h]��������������h�*��xi������������*X�l��������������0�*h�*�p����������-��*��*h]����������������*Ûh]ț������������h�*̛�pě��������-0�*h�*`o������������*��*xiݛ��������P�*�`f֛ �*�h����hg����*h�*��*����`�������*�*h]�������������������h]����������������*��xi������������*X�l��������������H�*��*xi���������8�*� `o����������'��*�*h]���������������*�ha����*h�*HC ��*�����x+0�*��*�*��*��*h�*h]������������������*����^�������������x�*P�*����Xe������*` -�����`�*X�*h]�������������P���xi"�����������*� xi!����������*��� h]"���������������*#�ha -�0�*h�*HC ��*P��#�h]������������������*����^���������������*��*����Xe�����*h�*�*��|p} �*P��_���*+ +�+�|p}�+P��_�/�Š�������P��_����������+�+�+�+x+h]0���������������*1�h]4�������������h�*8�xi8��������� +X�l8��������������+�+xiB����������+� `o@���������'8+x+^2����������+�+����Xe0�+�c+�����+P+8+�+h]E���������������*F�xiJ��������� +� �pG���������2�+�+h]O���������������*P�pO����������x+����XeO��+`��������X+�+� +hB+��*`+��|p}�+P��_�@+`+`A+! +�|p} +P��_�R�Š�������P��_���������8+ �@ +*��h -+X +� +� +�+�+�+@+$+�$+ %+�&+,+P,+@-+�2+ +`\�����( -+� +h]b������������� �f�h]i�������������h�*m�xim���������� -+��lm�������������h -+� -+8 +X +h]y���������������*z��ln������������������ -+( +h]z�������������@ +{�ha\�� +�+HC �+ �{�^�������������� +� +����Xe����� +h]��������������@ +��xi����������X +/� �p����������-� +( +`��������� +@+�++��|p} +P��_��++ +�+�|p}�+P��_������������P��_����������+�+�+�+h]6������������� �*B��n5���������5�+`��������0+++x+8+��|p}X+P��_�+8+X+�+�|p}�+P��_�D���������P��_����������+�+h]R�������������P�*W�h]Z���������������*[�xi^���������X+� `o\���������&�+(+^X����������+p+����XeR��+fm�h+�h����hg1��+�+0+����`���������+X&+0A+�+�+��|p}�+P��_��+�+�+`+�|p}�+P��_������������P��_���������(+@+$+�$+ %+�&+,+P,+@-+�2+9+89+�>+@+P@+h]����������������*��xi�����������+ xi�����������+�� �p����������-@+�+`���������+�$+0&+8+�!+��|p}�!+P��_�x"+�"+�"+8#+�|p}X#+P��_������������P��_���������$+�$+ %+h]V������������� �*b�xie���������P`^c���������$+P$+����XeV��$+h]x���������������*��h]����������������*��xi�����������%+ `o����������& %+X%+^�����������$+�%+����Xex��%+�h����hg��+H+H&+����h]����������������*��xi�����������&+ �p����������2�&+�&+`���������'+�@+8+�)+��|p}�)+P��_�x*+�*+�*+ 8++�|p}X++P��_������������P��_����������:+,+P,+@-+�2+9+89+�>+@+P@+h]��������������@ +�h]���������������* -�xi -����������,+��l -�������������P,+�,+ -+@-+h]���������������*��l ������������������,+-+�p���������-,+x-+`��������X.+�9+(+`0+��|p}�0+P��_�@1+`1+�1+2+�|p} 2+P��_�����������P��_����������4+�2+9+89+h]5���������������*;�p5�����������2+����xiA����������3+ xi@����������3+��( �p<���������-3+�3+`��������x4+�9+�.+�6+��|p}�6+P��_�`7+�7+�7+ 8+�|p}@8+P��_�D�ܟ�������P��_���������9+89+h]ğ������������(�*ǟh]ʟ��������������*˟^ȟ��������9+89+����Xeğp9+�h����hg/��3+04+�9+����`��������`:+@+�@+(+h<+��|p}�<+P��_�H=+h=+�=+>+�|p}(>+P��_������������P��_����������>+@+P@+h]g���������������*m�xiq���������P?+0 xip����������?+��8 ^n����������>+h?+����Xeg��?+h]��������������(�*��h]����������������*��^����������@+P@+����Xe���@+hg���-+.+:+�����h����hg��'+H'+ A+����h -+X +� +� +�+�+�+@+$+�$+ %+�&+,+P,+@-+�2+9+89+�>+@+P@+hg��p +� +p+����h]Ѡ������������P�*֠h]۠������������(�*ޠ�pנ��������-�B+�B+h]��������������(�*��h]����������������*��^����������HC+�C+����Xe���C+h]�������������(�*�xi����������D+@ xi����������D+��H �p���������- D+�D+h]#�������������(�*&�p�*0�*0�*h�*H�*x�*��*�+�+�+x+�B+�B+HC+�C+ D+(E+hF+H+�H+(I+h])�������������h�*-�xi-����������F+X�l-�������������hF+�F+^'���������(E+�F+����Xe#�(G+�h����hg ��D+xG+�G+����hg͠C+D+�G+����h]C�������������h�*G�xiG���������hH+ SlG�������������H+8H+�H+�H+(I+h]N�������������P�*S�h]U�������������(�*X��lH������������������H+�H+`f<�`I+��*0�*H�*��*(�*��*�*��*��*��*P�*p�*��*h�*��*0�*h�*�*��*`�*��*0�*p�*0�*0�*h�*H�*x�*��*�+�+�+x+�B+�B+HC+�C+ D+(E+hF+H+�H+(I+�T+U+W+�W+(]+^+d+8i+pi+�j+�p+�q+�q+hs+u+v+8v+`��������0L+�V+�t+�w+��*8N+��|p}XN+P��_�O+8O+pv+!�O+�|p}�O+P��_�f�У�������P��_����������P+�T+U+W+�W+(]+^+d+8i+pi+�j+�p+�q+�q+hs+u+v+�L+HR+��|p}hR+P��_�(S+HS+hS+ �S+�|p}T+P��_�r�{��������P��_��������� Y+�T+U+W+�W+(]+^+d+8i+pi+�j+�p+�q+�q+h]s���������������*t�h]w�������������h�*{�xi{���������hU+X�l{�������������U+8U+xi�����������U+P `o����������'�U+�U+^u����������T+V+����Xes�HV+�cn�����XX+�V+�W+@X+h]����������������*��xi����������hW+X �p����������2W+8W+h]����������������*��p������������W+����Xe���W+`���������X+8s+�P+�Z+��|p}�Z+P��_��[+�[+�[+ H\+�|p}h\+P��_���{��������P��_����������l+(]+^+d+8i+pi+�j+�p+�q+�q+h]��������������h�*��xi�����������]+��l��������������(]+`]+�]+^+h]����������������*���l�������������������]+�]+xi�����������^+/` �p����������-P^+�^+`��������x_+�j+ Y+�a+��|p}�a+P��_�`b+�b+�b+ c+�|p}@c+P��_�á���������P��_���������0e+d+8i+pi+h]^������������� �*j��n]���������5d+`���������d+�j+�j+�_+�f+��|p}�f+P��_��g+�g+�g+Xh+�|p}xh+P��_�l����������P��_���������8i+pi+h]z�������������P�*�h]����������������*��xi�����������i+h `o����������&pi+�i+^����������8i+�i+����Xez�0j+f���V+�h����hgY�8d+hd+�j+����h]��������������(�*��xiĢ��������Xk+p xiâ���������k+��x �p����������-�j+pk+`��������@l+�q+�r+ Y+Hn+��|p}hn+P��_�(o+Ho+ho+�o+�|p}p+P��_�Ǣs��������P��_����������p+�q+�q+h]=������������� �*I�xiL���������P`^J����������p+q+����Xe=�0q+h]]�������������(�*`�h]c���������������*d�xig���������8r+� `oe���������&�q+r+^a����������q+Pr+����Xe]��r+�h����hg���k+�k+�r+����hg���^+0_+s+����h]��������������(�*��xi�����������s+� xi����������t+��� �p����������-hs+�s+xi�����������t+�`f��pt+�h����hg��0t+�t+�t+����h]��������������h�*��xi����������xu+ Sl��������������u+Hu+�u+v+8v+h]��������������P�*ãh]ţ������������(�*ȣ�T+U+W+�W+(]+^+d+8i+pi+�j+�p+�q+�q+hs+u+v+8v+�l�������������������u+�u+`f��xw+hgP�`�*��*�K+����HC ��*�i�����h]����������������x+����ha����`x+��*h]����������������x+�����vT���������^��������������x+�x+����Xe����y+�tT� ����"�i���*��*�P��_�z+z+ z+T�P�*�y+(����xiڣ����xz+�(��|+�(��|p}��+ -P��_��|+}+��+!x�+ �~+ �+�|p}�}+P��_���N��������P��_�����������+��+�0�@�+V�W!H"�~+�k�P�"(+:-��83�P�+bF:,���z��d�!�~+v�= 6(�+&�(5(�+�+��+(�+��+��+��+��+P�+p�+Ȋ+h�+،+��+@�+��+��+ �+0�+��+�+HC �z+�!��������HC �z+H"��������HC �z+�"�������� 6�+��h]��������������(�+��HC �z+ 6����H�+ -��+Ё+(�+8�+�+�+��+h]�������������Ȗ -��+(�+h] �������������(�+��l�������������������+��+Xe�`�+`������+�+h]��������������0�"�xi&�����������+� xi%���������Ђ+��� h]&�������������@�+'�ha���+�z+HC �z+�0�'�h]����������������@�+����^���������������+��+����Xe������+`-�����p�+ �+h]1�������������83�:�xi=�����������+� h]=�������������P�+>�ha-���+�z+HC �z+83�>�h]����������������P�+����^���������������+��+����Xe����Ѕ+`D�������+��+h]H����������������K�xiO�����������+� xiN���������8�+��� h]O�������������(�+P�haD�P�+�z+83�P�+bF:,�0�@�+V�W!�!�~+v�= 6(�+&�(5@���+Ƹ‰ H"�~+�k�P�"(+:-�����(�+z��dЌ� �+���nX;�0�+�Z�FHC �z+���P�h]����������������(�+����^�������������p�+�+����Xe������+`V�����X�+��+h]Z�������������Ќ�f�xii�����������h]i������������� �+m�haV�Ȋ+�z+HC �z+Ќ�m�h]���������������� �+����^�������������h�+��+����Xe������+`������P�+H�+h]��������������X;���xi������������+� h]��������������0�+��ha��،+�z+HC �z+X;��� �+ �+0�+��+�+�+x�+h]����������������0�+����^���������������+��+����Xe������+�z+��+��|p}�+P��_�А+��+�+��+�|p}��+P��_��Ө�������P��_�����������+��+��+Е+��+h] �������������@� �h]�������������(�+�xi����������+X�l���������������+��+xi�����������+� `o���������'(�+h�+`�����8�+h�+h]���������������+�ha�@�+h�+HC �z+@��h]������������������+����^���������������+��+����Xe�����+�c�����(�+��+P�+�+h] ���������������+!�xi%���������8�+� �p"���������2Е+�+h]*���������������++�p*������������+����Xe*�Ȗ+`��������p�+��+��+��+��+`�+�z+x�+��|p}��+P��_�X�+x�+��+!�+�|p}8�+P��_�-�Ө�������P��_�����������+ �X�+*����+p�+�+�+��+Щ+�+��+��+��+��+(�+��+��+��+��+8�+`5�����@�+��+h];������������� �?�h]B�������������(�+F�xiF�����������+��lF���������������+��+P�+p�+h]R���������������+S��lG������������������+@�+h]S�������������X�+T�ha5��+��+HC ��+ �T�^��������������+��+����Xe������+h]`�������������X�+d�xii���������p�+/� �pe���������-�+@�+`���������+X�+��+��+�+��|p}8�+P��_���+�+8�+��+�|p}أ+P��_�r�h��������P��_���������ȥ+��+Щ+�+h]������������� �+��n���������5��+`��������H�+�+0�+��+P�+��|p}p�+P��_�0�+P�+p�+��+�|p}�+P��_��N��������P��_���������Щ+�+h]!�������������P�+*�h]-���������������+.�xi1���������p�+� `o/���������&�+@�+^+���������Щ+��+����Xe!�Ȫ+f>���+�h����hg�Ф+�+H�+�����eW���+�h����hg\���+ȟ+��+����h]s�������������(�+v�xi|���������H�+� xi{�����������+��� �pw���������-��+`�+`��������0�+p�+г+��+8�+��|p}X�+P��_��+8�+X�+ذ+�|p}��+P��_����������P��_�����������+��+��+h]�������������� �+��xi����������P`^������������+��+����Xe�� �+h]�������������(�+ �h]���������������+�xi���������(�+� `o���������&��+��+^ �����������+@�+����Xe���+�h����hgo���+��+��+����h]'�������������X�++�xi0�����������+.�p,���������-(�+`�+`��������0�+��+��+8�+��|p}X�+P��_��+8�+X�+ظ+�|p}��+P��_�9���������P��_�����������+��+��+��+��+h]��������������@�+��xi���������� �+xi����������h�+���p����������-��+8�+h]��������������@�+��h]����������������+��^������������+��+����Xe��0�+h]̧������������0�+קxiܧ���������+�pا��������-��+л+�nا��������5�+h]��������������0�+��xi������������+ ^������������+��+����Xe���+�h����hgȧX�+X�+p�+����hg����+��+��+������+p�+�+�+��+Щ+�+��+��+��+��+(�+��+��+��+��+��+��+��+h] �������������@�+�xi���������P�+(xi�����������+��0�p���������-��+h�+�n���������5��+`��������h�+�+��+p�+��|p}��+P��_�P�+p�+��+�+�|p}0�+P��_��ͨ�������P��_�����������+h]��������������0�+��xiè��������X�+8xi¨����������+��@^������������+p�+����Xe����+�h����hg���+ �+ �+����hg#���+��+0�+�����+��+(�+��+��+��+��+P�+p�+Ȋ+h�+،+��+@�+��+��+Е+��+��+��+��+��+��+��+ �+X�+��+��+��+h]ݨ������������@�+��xi�����������+Hxi����������H�+��P�p����������-��+�+h]��������������(�+��xi����������+Xxi���������P�+��`�p����������-��+ �+`o����������`�+h�+h]O�������������0�+Z�xi_���������P�+h�p[���������-��+ �+`o�����������+h�+h]��������������0�+��xi����������P�+p�p����������-��+ �+h]Ω������������@�+֩h]۩������������(�+ީxi����������H�+x`oߩ��������'��+�+�pש��������-��+`�+`o©��������h�+��+h]��������������@�+��h]��������������P�+�xi�����������+�`o���������&X�+��+�p����������- �+��+`o������������+�+`oa�����������+X�+`�������� �+��+�z+(�+��|p}H�+P��_��+(�+H�+��+�|p}��+P��_� �$��������P��_���������xi�����������+�`f���+�h����hg٨��+��+�+������+��+Ё+(�+8�+�+�+��+�+��+h]0�������������(�+4�xi4���������8�+ Sl4���������������+�+��+��+��+h];�������������@�+C�h]E�������������(�+H��l5�����������������P�+��+`f)�0�+HC �z+�(�����h]������������������+����ha������+�z+h]������������������+�����v����������^�������������@�+x�+����Xe������+�t������"�(��z+p�+�P��_���+��+��+��Hz+�+*����xiT������+�����+���|p}��+P��_���+��+��+@�+ �+��+�|p}`�+P��_�k�Z��������P��_����������+H"h�+�k�P�"��+:-���! �+v�= 8<��+�����+x�+H�+��+ �+�+��+p�+��+HC �+�!��������HC �+H"��������HC �+�"��������8<x�+v�h]l���������������+v�HC �+8<�����+h�+��+�+h]����������������+��xi�������������p����������-H�+��+h]����������������+���n����������8��+xi������������+����p����������-(�+X�+�n����������5��+`o������������+��+`����������+h�+�+��+��|p}��+P��_���+��+��+@�+�|p}`�+P��_���1��������P��_��������� �+�+h]˪������������x�,Ԫh�+��+��+�+@�+ު��+x�+��+��+H�+xiު����������+h��xiު����������+h��h]���������������+ ��n���������8�+xi �����������+�xi �����������+��+H�+n������������+`oު��������&��+ �+`o���������&`�+x�+hmǪ�������� �+X�+�����s������������+Xe��8�+�h����hg~��+P�+��+����h]=��������������RD��+(�+p�+xiE���������X�+`h]J���������������+T��l=�������������������+��+`f6���+HC �+������h]�����������������+����ha����`�+�+h]�����������������+�����v\���������^���������������+��+����Xe�����+�t\�����"���+��+�P��_��+�+ �+\���+��+,�����j)(�)��)�)��*��*(�* z+��+ �+��,��,��,@�,��,xi`������+�����+���|p}� , P��_���+��+pz,�dH&, 0�+p�,�|p}p�+P��_�u�`� - �������P��_���������p,����+�������n�H"x�+�k�P�"��+:-�� ��,*���!0�+v�= 6��+&�(5��+��+X�+��+P�+��+��+��+��+�, ,H,,(,P,�,� ,��+�,@,�,HC (�+�!��������HC (�+H"��������HC (�+�"�������� 6��+z�h]v���������������+z�HC (�+ 6����ؤ,#P�+h�+8�+h�+�,�,,h]��������������Ȗ����+��+h]����������������+���l������������������X�+��+Xe����+`��������+x�+h]��������������������+ ��+h�+ �+��+xi����������P�+�>xi������������+� �+h�+��������xi�����������+�=xi����������P�+���+ �+��������xi������������+p?xi�����������+���+��+��������xi«��������x�+Axiǫ����������+�H�+��+��������xi˫��������0�+h@xiѫ��������x�+��+H�+����������+h�+ �+��+��+ j������������+����h]ԫ��������������+իha��P�+(�+HC (�+��իh]������������������+����^���������������+�+����Xe����(�+h]߫��������������+��xi������������+X�l����������������+��+xi������������+��p����������-�+P�+h]����������������+�`f����+�h����hg۫��+�+(�+����`�������+�,h] ������������� ��h]���������������+�xi���������X�+��l���������������+(�+��+��+xi#���������,��l�����������������p�+��+h]$��������������,%�ha��,(�+HC (�+ �%�h]�����������������,����^������������� ,(,����Xe����X,`+�����,�,h]/���������������9�h]=��������������,A�xiF����������,/��pB���������-H,�,h]M��������������,N�ha+�,(�+Ќ��,���n @�Ƹ‰ 83��,bF:, ����+�������,�n��!0�+v�= 6��+&�(5H"x�+�k�P�"��+:-�� ��,*��H��,�S_�0��,V�W!����,z��d -HC (�+��N�h]�����������������,����^�������������(,�,����Xe����`,`T�����,h]X�������������H�]�h]X��������������,]�haT�P,(�+HC (�+H�X�h]g��������������,q�`��������p,P ,8,(�+x ,��|p}� ,P��_�X -,x -,� -, ,�|p}8 ,P��_�s����������P��_���������� ,h ,h]{���������������+~�xi~���������` ,�>l~�������������� ,0 ,xi����������� ,`^����������x ,� ,����Xe{� ,h]���������������,��xi����������� ,�^����������h ,� ,����Xe��� ,��+X�+��+P�+��+��+��+��+�, ,H,,(,P,�,� ,h ,(,X,@,8,�,�,0,�,(,P,� ,8$,�%,�&,�+,,,`���������,�,(�+�,��|p}�,P��_��,�,�,H,�|p}h,P��_������������P��_���������(,h]���������������,��xi�����������,�^����������(,`,����Xe���,hgc��,(,X,����`Ĭ�����,�,h]Ȭ�������������0�ЬxiԬ���������,�xiӬ��������@,���h]Ԭ�������������,լhaĬX,(�+HC (�+�0�լ��+�,@,�,�,p,�,�,� ,h]�����������������,����^�������������@,,����Xe����x,P�+h�+8�+h�+�,�,,@,h,x,�,�,�$,�+,�,X�,`۬�����,`,h]߬������������83���xi���������� ,�h]���������������,��ha۬8,(�+HC (�+83���h]�����������������,����^��������������,�,����Xe����,`�������,�,h]�������������������xi����������0,�xi����������x,���h]���������������,��ha���,(�+HC (�+�����h]�����������������,����^�������������0,H,����Xe����h,`�����,�,h]�������������Ќ��xi�����������h]��������������,�ha��,(�+HC (�+Ќ��h]�����������������,����^�������������(,X,����Xe����`,`!�����,�$,h]%�������������@�&�h])���������������+-�xi-����������,X�l-�������������P,�,xi7���������@ ,�`o5���������'�, ,h]7��������������#,8�ha!�� ,(�+83��,bF:, @��#,Ƹ‰ 6��+&�(5 ��,*��Ќ��,���n ����+�������,�n��!0�+v�= �0��,V�W!H"x�+�k�P�"��+:-��H��,�S_����,z��d -X;�&,�Z�F HC (�+@�8�h]�����������������#,����^�������������8$,X ,����Xe����p$,`������ %,h',h]��������������X;�ĭxiǭ���������%,�h]ǭ������������&,ȭha���%,(�+HC (�+X;� ȭp�,��+�,@,�,�,p,�,�,� ,�%,h]����������������&,����^��������������&,`%,����Xe����',(�+),��|p}0),P��_��),*,�[,!�*,�|p}�*,P��_������������P��_����������-,�+,,,�,,�1,02, 3,4,�9,�>,?,�@,�F,�G,�G,8I,�N,�c������(-,P,,-,h]���������������#,��h]���������������,���p����������2�+,,,h]���������������#,��p������������,,����Xe���,,`��������p-,4,�@,I,p[,�',x/,��|p}�/,P��_�X0,x0,�R,!1,�|p}81,P��_������������P��_����������U,�1,02, 3,4,�9,�>,?,�@,�F,�G,�G,8I,�N,�O,P,�P,h]��������������, �h]���������������+�xi����������2,��l�������������02,h2,3, 3,h]��������������#,��l������������������2,�2,^ ����������1,X3,����Xe��3,h],��������������,0�xi5����������4,/��p1���������-4,P4,`�������� 5,h@,�@,�-,(7,��|p}H7,P��_�8,(8,H8,�8,�|p}�8,P��_�>�4��������P��_����������:,�9,�>,?,h]Ӯ�������������,߮�nҮ��������5�9,`��������X:,(@,@@,�5,`<,��|p}�<,P��_�@=,`=,�=,>,�|p} >,P��_�����������P��_����������>,?,h]���������������,��h]���������������#,��xi�����������?,�`o����������&?,P?,^�����������>,�?,����Xe���?,f -��+,�h����hgή�9,:,X@,�����e#��+,�h����hg(��4,�4,�@,����h]?��������������,B�xiH���������XA,�xiG����������A,���pC���������-�@,pA,`��������@B,�G,�H,�-,HD,��|p}hD,P��_�(E,HE,hE,�E,�|p}F,P��_�K����������P��_����������F,�G,�G,h]���������������,¯xiů��������P`^ï���������F,G,����Xe��0G,h]ԯ�������������,ׯh]گ�������������#,ۯxiޯ��������8H,`oܯ��������&�G,H,^د���������G,PH,����Xeԯ�H,�h����hg;��A,�A,�H,����h]���������������,��xi�����������I,.�p����������-8I,pI,`��������@J,�R,�-,HL,��|p}hL,P��_�(M,HM,hM,�M,�|p}N,P��_��Ͱ�������P��_����������N,�O,P,�P,�Q,h]^��������������,f�xil���������0O,xik���������xO,�� �pg���������-�N,HO,h]y��������������,��h]���������������#,��^�����������O,P,����Xey�@P,h]��������������&,��xi����������Q,(�p����������-�P,�P,�n����������5(Q,h]��������������&,��xið��������R,0^�����������Q,�Q,����Xe��R,�h����hg��hQ,hR,�R,����hgZ��O,�P,�R,�����1,02, 3,4,�9,�>,?,�@,�F,�G,�G,8I,�N,�O,P,�P,�Q,�S,Z,h]װ�������������,߰xi����������`T,8xi�����������T,��@�p����������-�S,xT,�n����������5�T,`��������xU,[,�-,�W,��|p}�W,P��_�`X,�X,�X, Y,�|p}@Y,P��_������������P��_���������Z,h]��������������&,��xi����������hZ,Hxi�����������Z,��P^����������Z,�Z,����Xe���Z,�h����hgӰU,0U,0[,����hg���I,�I,@[,�����+,,,�,,�1,02, 3,4,�9,�>,?,�@,�F,�G,�G,8I,�N,�O,P,�P,�Q,�S,Z,��+X�+��+P�+��+��+��+��+�, ,H,,(,P,�,� ,h ,(,X,@,8,�,�,0,�,(,P,� ,8$,�%,�&,�+,,,�,,�1,02, 3,4,�9,�>,?,�@,�F,�G,�G,8I,�N,�O,P,�P,�Q,�S,Z,�^,�_,a,b,�b,c,Hd,�d,�j,�p,�q,r,�r,�s,h]���������������,��xi����������(_,Xxi����������p_,��`�p����������-�^,@_,h]ı�������������,DZxiͱ��������0`,hxi̱��������x`,��p�pȱ��������-�_,H`,`o�����������_,�`,h]�������������&,&�xi+���������xa,x�p'���������-a,Ha,`oϱ���������`,�a,h]|�������������&,��xi����������xb,��p����������-b,Hb,h]���������������,��h]���������������,��xi����������pc,�`o����������'c,@c,�p����������-�b,�c,`o�����������b,�c,h]���������������,òh]Ȳ�������������,ѲxiԲ���������d,�`oҲ��������&�d,�d,�pIJ��������-Hd,e,`o����������d,@e,`o-����������a,�e,`��������Hf,@z,(�+Ph,��|p}ph,P��_�0i,Pi,pi, �i,�|p}j,P��_�ز���������P��_����������l,�j,�p,�q,r,�r,�s,�t,v,�v,�w,�x,�x,h]���������������,��xi����������8k,�xi�����������k,����p����������-�j,Pk,�n����������5�k,`��������Pl,z,�f,Xn,��|p}xn,P��_�8o,Xo,xo, �o,�|p}p,P��_������������P��_����������p,�q,r,�r,�s,�t,v,�v,�w,�x,�x,h]���������������,�xi ���������@q,��p���������-�p,q,h]��������������,�`o���������Xq,�q,h]'���������������+*�xi*���������xr,p?l*�������������r,Hr,h]2���������������+5�xi5���������8s,h@l5��������������r,s,h]=���������������+A�xiA����������s, SlA��������������s,�s,`t,�t,�t,xiH����������t,�h]K��������������,N��lB�����������������t,Pt,^;���������Ps,u,����^0����������r,Xu,����Xe'��u,h]h���������������+k�xik���������xv,p?lk�������������v,Hv,h]s���������������+v�xiv���������8w,h@lv��������������v,w,h]~���������������+��xi�����������w, Sl���������������w,�w,`x,�x,�x,h]���������������,��h]���������������,���l������������������x,Px,^|���������Pw,�x,����^q����������v,Hy,����Xeh��y,hg���q,�u,�y,�����h����hg���k,l,0z,������+X�+��+P�+��+��+��+��+�, ,H,,(,P,�,� ,h ,(,X,@,8,�,�,0,�,(,P,� ,8$,�%,�&,�+,,,�,,�1,02, 3,4,�9,�>,?,�@,�F,�G,�G,8I,�N,�O,P,�P,�Q,�S,Z,�^,�_,a,b,�b,c,Hd,�d,�j,�p,�q,r,�r,�s,�t,v,�v,�w,�x,�x,x�,8�,��,@�,x�,p�,0�,h�,0�,��,��,�,�,З,��,��, �,��,؜,�,8�,��,��,��,p�,��,��,`���������~,��,��,(�+��,��|p}�,P��_�؁,��,X�,!��,�|p}��,P��_���״�������P��_���������(�,x�,8�,��,@�,x�,p�,0�,h�,0�,��,��,�,�,З,��,��,h]���������������,³xidz����������,��pó��������-x�,��,h]̳�������������,ֳ`oɳ����������,8�,`����������,X�,H�,p,�,��|p} �,P��_���,�, �,��,�|p}��,P��_�س4��������P��_�����������,@�,x�,p�,0�,h�,h]����������������+��xi������������,h@l����������������,��,h]����������������+��xi������������, Sl��������������@�,x�,�,0�,x�,xi����������`�,�h]���������������,��l��������������������,�,^�����������,��,����Xe���,h]���������������+�xi���������،,p?l�������������p�,��,h]���������������+�xi�����������, Sl�������������0�,h�,�, �,h�,xi$���������P�,�h]'��������������,*��l�������������������,��,^�����������,��,����Xe���,`����������,��,ؙ,p,��,��|p}Б,P��_���,��,В,P�,�|p}p�,P��_�:����������P��_���������0�,��,��,�,�,З,��,��,h]D���������������+G�xiG�����������,h@lG�������������0�,h�,h]O���������������+S�xiS���������X�, SlS���������������,(�,��,��,�,h]Z��������������,c�h]e��������������,m��lT�����������������p�,��,^M�����������,P�,����XeD���,h]x���������������+{�xi{���������x�,p?l{��������������,H�,h]����������������+��xi����������8�, Sl��������������З,�,��,��,��,h]���������������,��h]���������������,���l������������������P�,��,^������������,0�,����Xex���,hg��p�,��,`�,����h]����������������+��x�,8�,��,@�,x�,p�,0�,h�,0�,��,��,�,�,З,��,��, �,��,؜,�,xi������������,Al�������������� �,`�,h]����������������+��xi����������P�, Sl����������������, �,��,؜,�,h]´�������������,ʴh]̴�������������,ϴ�l������������������h�,��,^������������,H�,����Xe����,hg���e,f,�~,����h]���������������,��xi������������,��p����������08�,p�,h]����������������+��xi����������`�,�=l����������������,0�,h]���������������+�xi��������� �, Sl���������������,��,��,��,p�,xi ���������ؠ,�h]��������������,�xi���������X�,�`o���������'��,(�,�l�����������������8�,x�,^����������x�,��,����Xe���,h]+��������������,5�h]=���������������+@�xi@����������,�=l@���������������,��,xiG�����������,`^E���������(�,h�,����Xe=���,�h����hg'�p�,�,�,����hgݴ��,X�,(�,����h]X���������������+[�`fQ���,@�,P�+h�+8�+h�+�,�,,@,h,x,�,�,�$,�+,�,X�,��,HC (�+�� -����h]������������������,����ha����8�,(�+h]������������������,�����vg���������^���������������,Ȧ,����Xe������,�tg�����"��(�+�+�P��_���,��,��,g���+X�,.����xif�����P�,�;xik� ������,` �,h�,��������xir�#�����,�):](� �,V�~�xi}�&������,(�,ب,X�,��������xi��)������,�Sxi��,������ȩ,�,��������xi��/������,�)xi��2������h�,��,�������� j5������@)����h]�������������,��ha'�X�,�HC ��) -��^����������X�,�,����Xe������,h]��?����������,��xi��<����Ȭ,�Sl��9��������`�,��,h]��L��������)��xi��I������,�Sl��F�������� �,X�,h]��O��������)ŵ^��B������,��,0^��5������,�,2Xe��h�,h]ǵ\����������,̵�$ %�%&�&�-p/h��h5PO�)X�,`�, �,��,Ю,��,X�,H�,ȳ,��,(�,��,xi̵Y����@�,�)l̵V��������Ю,�,h]յi��������)ڵxiڵf�����,�)lڵc����������,а,h]��l����������,��^��_�����,X�,4^ӵR����X�,��,6Xeǵ��,h]��{����80�,��platform]0���,�-��xi��x������,��,l��u����:H�,��,xi�~����p�,�S�p�r����-�,@�,h]����������h(�xi������0�,�#l����������ȳ,�,h]!����������)&�^������H�,��,��������,��,>Xe/� �,hg����,�,p�,o�t ����d��+��P��_���,0�,0�,Xe��,�t���������� �P��_��,�,�,����HC ��$����h]���� ���������,����^��������X�,��,����h]K����������,����`fK���,HC ���������HC �(���������HC �H$���������45P5�6.this_function]�H�,�s�p�p����x���8�8������ �� -���`�����(�h�(�P�`�`� � -`:�:�:�<�< ?@C0�YXY�Y \p^�``i�qX��� �� -@� x� �� ��}��9�@:��:��;��>�B��F��H�J�b� e� -(�� (� HL��L��L��M� Q��U�����z�8{��{������@��`��@��ؤ�0�� �-�0.�x.� 0�h0�7�<�XF��V��i� l� -h|� H�� p�� @�����������P��p3��3�4�5��@��I� �h���������x������������� ��� -��� @@� Ї�H��� �0n�xn��n��o�@p�0w�{�}��~���� ��� -�M�-�X-��-��.��1�@4�8�:�`<��C� ���Ѝ��������Ȥ�����0����� ��x��p��h�� h�� -�( ��( P�( ��(��(�(�))P)�!)�#)P%)P-)�6)@o)�o)�o)�p)Xw)|)��)��)0�)0�)�)X�)��)��)�)h�)��)�)H�)��)��)��)��)(�)8�)h�) (* -P* �* � -* hN*�R*@a*p�*��*�*�*h�*��*��*��*��*��*��*��*��*@ +��*��*0�*h�*��*P�*(�* �*��*��* ��* -X�+�~+�~+(+(�+@�+P�+(�+ �+0�+��+ �+h�+��+��+0�+x�+��+��+��+�,�,�,�,�, �, -�, �#, &, �!x"#�' (h(0*x*�/Ȗ p� -�5 �R ) ��,0�,x�,��,�' (h(0*x*�/Ȗ p� -�5 �R ) ��,�,0�,x�,��, diff --git a/Chapter03/working-with-files/incremental-processing/file.dat b/Chapter03/working-with-files/incremental-processing/file.dat deleted file mode 100644 index 6a97696971bbb1f57a0fb7389c07923490aa21d2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1079453 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 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* p1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<`0rfd$-lw{rjh diff --git a/Chapter03/working-with-files/incremental-processing/log.txt b/Chapter03/working-with-files/incremental-processing/log.txt deleted file mode 100644 index d210d7f..0000000 --- a/Chapter03/working-with-files/incremental-processing/log.txt +++ /dev/null @@ -1,4 +0,0 @@ -Wed Jun 08 2016 23:48:13 GMT+0100 (BST) 896977 bytes removed -Wed Jun 08 2016 23:48:17 GMT+0100 (BST) 896977 bytes removed -Wed Jun 08 2016 23:49:25 GMT+0100 (BST) 896977 bytes removed -Wed Jun 08 2016 23:50:17 GMT+0100 (BST) 896977 bytes removed diff --git a/Chapter03/working-with-files/incremental-processing/null-byte-remover.js b/Chapter03/working-with-files/incremental-processing/null-byte-remover.js deleted file mode 100644 index 9a57267..0000000 --- a/Chapter03/working-with-files/incremental-processing/null-byte-remover.js +++ /dev/null @@ -1,23 +0,0 @@ -'use strict' - -setInterval(() => process.stdout.write('.'), 10).unref() - -const fs = require('fs') -const path = require('path') -const cwd = process.cwd() - -const sbs = require('strip-bytes-stream') - -fs.createReadStream(path.join(cwd, 'file.dat')) - .pipe(sbs((n) => n)) - .on('end', function () { log(this.total) }) - .pipe(fs.createWriteStream(path.join(cwd, 'clean.dat'))) - -function log(total) { - fs.appendFile( - path.join(cwd, 'log.txt'), - (new Date) + ' ' + total + ' bytes removed\n' - ) -} - - diff --git a/Chapter03/working-with-files/incremental-processing/package.json b/Chapter03/working-with-files/incremental-processing/package.json deleted file mode 100644 index 859e5c4..0000000 --- a/Chapter03/working-with-files/incremental-processing/package.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "name": "piping", - "version": "1.0.0", - "description": "", - "main": "null-byte-remover.js", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" - }, - "author": "David Mark Clements", - "license": "MIT", - "dependencies": { - "strip-bytes-stream": "^1.1.0" - } -} diff --git a/Chapter03/working-with-files/log.txt b/Chapter03/working-with-files/log.txt deleted file mode 100644 index 4706c31..0000000 --- a/Chapter03/working-with-files/log.txt +++ /dev/null @@ -1,6 +0,0 @@ -Wed Jun 08 2016 22:56:41 GMT+0100 (BST) 100000000 bytes removed -Wed Jun 08 2016 22:56:54 GMT+0100 (BST) 897090 bytes removed -Wed Jun 08 2016 22:58:02 GMT+0100 (BST) 897090 bytes removed -Wed Jun 08 2016 22:58:03 GMT+0100 (BST) 897090 bytes removed -Wed Jun 08 2016 22:58:15 GMT+0100 (BST) 897090 bytes removed -Wed Jun 08 2016 22:59:08 GMT+0100 (BST) 897090 bytes removed diff --git a/Chapter03/working-with-files/null-byte-remover.js b/Chapter03/working-with-files/null-byte-remover.js deleted file mode 100644 index e891808..0000000 --- a/Chapter03/working-with-files/null-byte-remover.js +++ /dev/null @@ -1,15 +0,0 @@ -'use strict' - -const fs = require('fs') -const path = require('path') -const cwd = process.cwd() -const bytes = fs.readFileSync(path.join(cwd, 'file.dat')) - -const clean = bytes.filter(n => n) -fs.writeFileSync(path.join(cwd, 'clean.dat'), clean) - -fs.appendFileSync( - path.join(cwd, 'log.txt'), - (new Date) + ' ' + (bytes.length - clean.length) + ' bytes removed\n' -) - diff --git a/Chapter08/anticipating-malicious-input/app/index-fixed.js b/Chapter08/anticipating-malicious-input/app/index-fixed.js deleted file mode 100644 index 1de4afa..0000000 --- a/Chapter08/anticipating-malicious-input/app/index-fixed.js +++ /dev/null @@ -1,21 +0,0 @@ -'use strict' - -const express = require('express') -const app = express() - -app.get('/', (req, res) => { - pretendDbQuery(() => { - var msg = req.query.msg - - if (Array.isArray(msg)) msg = msg.pop() - - const yelling = (msg || '').toUpperCase() - res.send(yelling) - }) -}) - -app.listen(3000) - -function pretendDbQuery (cb) { - setTimeout(cb, 0) -} diff --git a/Chapter08/anticipating-malicious-input/app/index.js b/Chapter08/anticipating-malicious-input/app/index.js deleted file mode 100644 index 120c6ae..0000000 --- a/Chapter08/anticipating-malicious-input/app/index.js +++ /dev/null @@ -1,17 +0,0 @@ -'use strict' - -const express = require('express') -const app = express() - -app.get('/', (req, res) => { - pretendDbQuery(() => { - const yelling = (req.query.msg || '').toUpperCase() - res.send(yelling) - }) -}) - -app.listen(3000) - -function pretendDbQuery (cb) { - setTimeout(cb, 0) -} diff --git a/Chapter08/anticipating-malicious-input/app/package.json b/Chapter08/anticipating-malicious-input/app/package.json deleted file mode 100644 index 8711bc5..0000000 --- a/Chapter08/anticipating-malicious-input/app/package.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "name": "app", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" - }, - "keywords": [], - "author": "", - "license": "ISC", - "dependencies": { - "express": "^4.15.2" - } -} diff --git a/Chapter08/anticipating-malicious-input/buffer-safety/index-fixed.js b/Chapter08/anticipating-malicious-input/buffer-safety/index-fixed.js deleted file mode 100644 index d40f2c2..0000000 --- a/Chapter08/anticipating-malicious-input/buffer-safety/index-fixed.js +++ /dev/null @@ -1,87 +0,0 @@ -'use strict' - -const http = require('http') - -const server = http.createServer((req, res) => { - if (req.method === 'GET') { - res.setHeader('Content-Type', 'text/html') - if (req.url === '/') return res.end(html()) - res.setHeader('Content-Type', 'application/json') - if (req.url === '/friends') return res.end(friends()) - - return - } - if (req.method === 'POST') { - if (req.url === '/') return action(req, res) - } -}) - -function html (res) { - return ` -

-
- -
- - ` -} - -function friends () { - return JSON.stringify(friends.list) -} -friends.list = [Buffer.from('Dave').toString('base64')] -friends.add = (friend) => { - friends.list.push(Buffer.from(friend).toString('base64')) -} - -function action (req, res) { - var data = '' - req.on('data', (chunk) => data += chunk) - req.on('end', () => { - try { - data = JSON.parse(data) - } catch (e) { - console.error(e) - res.end('{"ok": false}') - return - } - if (data.cmd === 'add') { - try { - friends.add(data.friend) - } catch (e) { - console.error(e) - res.end('{"ok": false}') - } - } - }) -} - -server.listen(3000) \ No newline at end of file diff --git a/Chapter08/anticipating-malicious-input/buffer-safety/index.js b/Chapter08/anticipating-malicious-input/buffer-safety/index.js deleted file mode 100644 index a155ac8..0000000 --- a/Chapter08/anticipating-malicious-input/buffer-safety/index.js +++ /dev/null @@ -1,80 +0,0 @@ -'use strict' - -const http = require('http') - -const server = http.createServer((req, res) => { - if (req.method === 'GET') { - res.setHeader('Content-Type', 'text/html') - if (req.url === '/') return res.end(html()) - res.setHeader('Content-Type', 'application/json') - if (req.url === '/friends') return res.end(friends()) - - return - } - if (req.method === 'POST') { - if (req.url === '/') return action(req, res) - } -}) - -function html (res) { - return ` -
-
- -
- - ` -} - -function friends () { - return JSON.stringify(friends.list) -} -friends.list = [Buffer('Dave').toString('base64')] -friends.add = (friend) => friends.list.push(Buffer(friend).toString('base64')) - -function action (req, res) { - var data = '' - req.on('data', (chunk) => data += chunk) - req.on('end', () => { - try { - data = JSON.parse(data) - } catch (e) { - res.end('{"ok": false}') - return - } - if (data.cmd === 'add') { - friends.add(data.friend) - } - res.end('{"ok": true}') - }) -} - -server.listen(3000) \ No newline at end of file diff --git a/Chapter08/anticipating-malicious-input/json-validation/index-fixed.js b/Chapter08/anticipating-malicious-input/json-validation/index-fixed.js deleted file mode 100644 index 2ccb7f6..0000000 --- a/Chapter08/anticipating-malicious-input/json-validation/index-fixed.js +++ /dev/null @@ -1,78 +0,0 @@ -'use strict' - -const http = require('http') -const Ajv = require('ajv') -const ajv = new Ajv -const schema = { - title: 'UserReg', - properties: { - id: {type: 'integer'}, - name: {type: 'string'}, - privileges: { - anyOf: [ - {type: 'string'}, - {type: 'boolean'}, - {type: 'array', items: {type: 'string'}}, - {type: 'object'} - ] - } - }, - additionalProperties: false, - required: ['id', 'name'] -} -const validate = ajv.compile(schema) -const {STATUS_CODES} = http - -const server = http.createServer((req, res) => { - - if (req.method !== 'POST') { - res.statusCode = 404 - res.end(STATUS_CODES[res.statusCode]) - return - } - if (req.url === '/register') { - register(req, res) - return - } - res.statusCode = 404 - res.end(STATUS_CODES[res.statusCode]) - -}) - -function register (req, res) { - var data = '' - req.on('data', (chunk) => data += chunk) - req.on('end', () => { - try { - data = JSON.parse(data) - } catch (e) { - res.end('{"ok": false}') - return - } - const valid = validate(data, schema) - if (!valid) { - console.error(validate.errors) - res.end('{"ok": false}') - return - } - - if (data.hasOwnProperty('privileges')) { - createAdminUser(data) - res.end('{"ok": true, "admin": true}') - } else { - createUser(data) - res.end('{"ok": true, "admin": false}') - } - }) -} - -function createAdminUser (user) { - const key = user.id + user.name - // ... -} - -function createUser (user) { - // ... -} - -server.listen(3000) \ No newline at end of file diff --git a/Chapter08/anticipating-malicious-input/json-validation/index.js b/Chapter08/anticipating-malicious-input/json-validation/index.js deleted file mode 100644 index 9b39327..0000000 --- a/Chapter08/anticipating-malicious-input/json-validation/index.js +++ /dev/null @@ -1,53 +0,0 @@ -'use strict' - -const http = require('http') -const {STATUS_CODES} = http - -const server = http.createServer((req, res) => { - - if (req.method !== 'POST') { - res.statusCode = 404 - res.end(STATUS_CODES[res.statusCode]) - return - } - if (req.url === '/register') { - register(req, res) - return - } - res.statusCode = 404 - res.end(STATUS_CODES[res.statusCode]) - -}) - -function register (req, res) { - var data = '' - req.on('data', (chunk) => data += chunk) - req.on('end', () => { - try { - data = JSON.parse(data) - } catch (e) { - res.end('{"ok": false}') - return - } - // privileges can be multiple types, boolean, array, object, string, - // but the presence of the key means the user is an admin - if (data.hasOwnProperty('privileges')) { - createAdminUser(data) - res.end('{"ok": true, "admin": true}') - } else { - createUser(data) - res.end('{"ok": true, "admin": false}') - } - }) -} - -function createAdminUser (user) { - const key = user.id + user.name - // ... -} - -function createUser (user) { - // ... -} - -server.listen(3000) \ No newline at end of file diff --git a/Chapter08/anticipating-malicious-input/json-validation/package.json b/Chapter08/anticipating-malicious-input/json-validation/package.json deleted file mode 100644 index 23855f0..0000000 --- a/Chapter08/anticipating-malicious-input/json-validation/package.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "name": "json-validation", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" - }, - "keywords": [], - "author": "", - "license": "ISC", - "dependencies": { - "ajv": "^4.11.5" - } -} diff --git a/Chapter08/detecting-dependency-vulnerabilities/app/.snyk b/Chapter08/detecting-dependency-vulnerabilities/app/.snyk deleted file mode 100644 index 127718e..0000000 --- a/Chapter08/detecting-dependency-vulnerabilities/app/.snyk +++ /dev/null @@ -1,4 +0,0 @@ -# Snyk (https://snyk.io) policy file, patches or ignores known vulnerabilities. -version: v1.7.0 -ignore: {} -patch: {} diff --git a/Chapter08/detecting-dependency-vulnerabilities/app/package.json b/Chapter08/detecting-dependency-vulnerabilities/app/package.json deleted file mode 100644 index e449c98..0000000 --- a/Chapter08/detecting-dependency-vulnerabilities/app/package.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "name": "app", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1", - "audit": "auditjs" - }, - "keywords": [], - "author": "", - "license": "ISC", - "dependencies": { - "express": "^4.15.2" - }, - "devDependencies": { - "auditjs": "^2.0.2" - } -} diff --git a/Chapter08/guarding-against-xss/app/index.js b/Chapter08/guarding-against-xss/app/index.js deleted file mode 100644 index 5bd2a69..0000000 --- a/Chapter08/guarding-against-xss/app/index.js +++ /dev/null @@ -1,32 +0,0 @@ -'use strict' - -const express = require('express') -const app = express() - -app.get('/', (req, res) => { - const {prev = '', handoverToken = '', lang = 'en'} = req.query - pretendDbQuery((err, status) => { - if (err) { - res.sendStatus(500) - return - } - res.send(` -

Current Status

-
- ${status} -
- - `) - }) - -}) - -function pretendDbQuery (cb) { - const status = 'ON FIRE!!! HELP!!!' - cb(null, status) -} - - -app.listen(3000) \ No newline at end of file diff --git a/Chapter08/guarding-against-xss/app/package.json b/Chapter08/guarding-against-xss/app/package.json deleted file mode 100644 index 8711bc5..0000000 --- a/Chapter08/guarding-against-xss/app/package.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "name": "app", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" - }, - "keywords": [], - "author": "", - "license": "ISC", - "dependencies": { - "express": "^4.15.2" - } -} diff --git a/Chapter08/guarding-against-xss/fixed-app/index.js b/Chapter08/guarding-against-xss/fixed-app/index.js deleted file mode 100644 index 5bc4145..0000000 --- a/Chapter08/guarding-against-xss/fixed-app/index.js +++ /dev/null @@ -1,34 +0,0 @@ -'use strict' - -const express = require('express') -const he = require('he') -const app = express() - - -app.get('/', (req, res) => { - const {prev = '', handoverToken = '', lang = 'en'} = req.query - pretendDbQuery((err, status) => { - if (err) { - res.sendStatus(500) - return - } - const href = he.encode(`${prev}${handoverToken}/${lang}`) - res.send(` -

Current Status

-
- ${he.escape(status)} -
-
- Back to Control HQ - `) - }) - -}) - -function pretendDbQuery (cb) { - const status = 'ON FIRE!!! HELP!!!' - cb(null, status) -} - - -app.listen(3000) \ No newline at end of file diff --git a/Chapter08/guarding-against-xss/fixed-app/package.json b/Chapter08/guarding-against-xss/fixed-app/package.json deleted file mode 100644 index f6f3dbc..0000000 --- a/Chapter08/guarding-against-xss/fixed-app/package.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "name": "app", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" - }, - "keywords": [], - "author": "", - "license": "ISC", - "dependencies": { - "express": "^4.15.2", - "he": "^1.1.1" - } -} diff --git a/Chapter08/guarding-against-xss/fully-escaped-app/index.js b/Chapter08/guarding-against-xss/fully-escaped-app/index.js deleted file mode 100644 index 36251e0..0000000 --- a/Chapter08/guarding-against-xss/fully-escaped-app/index.js +++ /dev/null @@ -1,33 +0,0 @@ -'use strict' - -const express = require('express') -const escapeHtml = require('escape-html') -const app = express() - - -app.get('/', (req, res) => { - const {prev = '', handoverToken = '', lang = 'en'} = req.query - pretendDbQuery((err, status) => { - if (err) { - res.sendStatus(500) - return - } - const href = escapeHtml(`/${prev}${handoverToken}/${lang}`) - res.send(` -

Current Status

-
- ${escapeHtml(status)} -
-
- Back to Control HQ - `) - }) -}) - -function pretendDbQuery (cb) { - const status = 'ON FIRE!!! HELP!!!' - cb(null, status) -} - - -app.listen(3000) \ No newline at end of file diff --git a/Chapter08/guarding-against-xss/fully-escaped-app/package.json b/Chapter08/guarding-against-xss/fully-escaped-app/package.json deleted file mode 100644 index c18daca..0000000 --- a/Chapter08/guarding-against-xss/fully-escaped-app/package.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "name": "app", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" - }, - "keywords": [], - "author": "", - "license": "ISC", - "dependencies": { - "escape-html": "^1.0.3", - "express": "^4.15.2", - "he": "^1.1.1" - } -} diff --git a/Chapter08/guarding-against-xss/param-constraints-app/index.js b/Chapter08/guarding-against-xss/param-constraints-app/index.js deleted file mode 100644 index 955a110..0000000 --- a/Chapter08/guarding-against-xss/param-constraints-app/index.js +++ /dev/null @@ -1,46 +0,0 @@ -'use strict' - -const express = require('express') -const app = express() - -function validate ({prev, handoverToken, lang}, query) { - var valid = Object.keys(query).length <= 3 - valid = valid && typeof lang === 'string' && lang.length === 2 - valid = valid && typeof handoverToken === 'string' && handoverToken.length === 16 - valid = valid && typeof prev === 'string' && prev.length < 10 - return valid -} - -app.get('/', (req, res) => { - const {prev = '', handoverToken = '', lang = 'en'} = req.query - - if (!validate({prev, handoverToken, lang}, req.query)) { - res.sendStatus(422) - return - } - - pretendDbQuery((err, status) => { - if (err) { - res.sendStatus(500) - return - } - res.send(` -

Current Status

-
- ${status} -
- - `) - }) - -}) - -function pretendDbQuery (cb) { - const status = 'ON FIRE!!! HELP!!!' - cb(null, status) -} - - -app.listen(3000) \ No newline at end of file diff --git a/Chapter08/guarding-against-xss/param-constraints-app/package.json b/Chapter08/guarding-against-xss/param-constraints-app/package.json deleted file mode 100644 index a09118c..0000000 --- a/Chapter08/guarding-against-xss/param-constraints-app/package.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "name": "app", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" - }, - "keywords": [], - "author": "", - "license": "ISC", - "dependencies": { - "escape-html": "^1.0.3", - "express": "^4.15.2" - } -} diff --git a/Chapter08/guarding-against-xss/protocol-safe-app/index.js b/Chapter08/guarding-against-xss/protocol-safe-app/index.js deleted file mode 100644 index 36251e0..0000000 --- a/Chapter08/guarding-against-xss/protocol-safe-app/index.js +++ /dev/null @@ -1,33 +0,0 @@ -'use strict' - -const express = require('express') -const escapeHtml = require('escape-html') -const app = express() - - -app.get('/', (req, res) => { - const {prev = '', handoverToken = '', lang = 'en'} = req.query - pretendDbQuery((err, status) => { - if (err) { - res.sendStatus(500) - return - } - const href = escapeHtml(`/${prev}${handoverToken}/${lang}`) - res.send(` -

Current Status

-
- ${escapeHtml(status)} -
-
- Back to Control HQ - `) - }) -}) - -function pretendDbQuery (cb) { - const status = 'ON FIRE!!! HELP!!!' - cb(null, status) -} - - -app.listen(3000) \ No newline at end of file diff --git a/Chapter08/guarding-against-xss/protocol-safe-app/package.json b/Chapter08/guarding-against-xss/protocol-safe-app/package.json deleted file mode 100644 index a09118c..0000000 --- a/Chapter08/guarding-against-xss/protocol-safe-app/package.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "name": "app", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" - }, - "keywords": [], - "author": "", - "license": "ISC", - "dependencies": { - "escape-html": "^1.0.3", - "express": "^4.15.2" - } -} diff --git a/Chapter08/preventing-cross-site-request-forgery/app/index.js b/Chapter08/preventing-cross-site-request-forgery/app/index.js deleted file mode 100644 index c541738..0000000 --- a/Chapter08/preventing-cross-site-request-forgery/app/index.js +++ /dev/null @@ -1,80 +0,0 @@ -'use strict' - -const express = require('express') -const bodyParser = require('body-parser') -const session = require('express-session') -const he = require('he') -const app = express() - -const pretendData = { - dave: { - ac: '12345678', - sc: '88-26-26' - } -} - -app.use(session({ - secret: 'AI overlords are coming', - name: 'SESSIONID', - resave: false, - saveUninitialized: false -})) - -app.use(bodyParser.urlencoded({extended: false})) - -app.get('/', (req, res) => { - if (req.session.user) return res.redirect('/profile') - res.send(` -

Login

-
-
-
- -
- `) -}) - -app.post('/', (req, res) => { - if (req.body.user === 'dave' && req.body.pass === 'ncb') { - req.session.user = req.body.user - } - if (req.session.user) res.redirect('/profile') - else res.redirect('/') -}) - -app.get('/profile', (req, res) => { - if (!req.session.user) return res.redirect('/') - const {prev = '', handoverToken = '', lang = 'en'} = req.query - pretendDbQuery(req.session.user, (err, {sc, ac}) => { - if (err) { - res.sendStatus(500) - return - } - sc = he.encode(sc) - ac = he.encode(ac) - res.send(` -

Employee Payment Profile

-
-
-
- -
- `) - }) -}) - -app.post('/update', (req, res) => { - if (!req.session.user) return res.sendStatus(403) - pretendData[req.session.user].ac = req.body.ac - pretendData[req.session.user].sc = req.body.sc - res.send(` -

updated

- - `) -}) - -function pretendDbQuery (user, cb) { - cb(null, pretendData[user]) -} - -app.listen(3000) diff --git a/Chapter08/preventing-cross-site-request-forgery/app/package.json b/Chapter08/preventing-cross-site-request-forgery/app/package.json deleted file mode 100644 index b7d89f0..0000000 --- a/Chapter08/preventing-cross-site-request-forgery/app/package.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "name": "app", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" - }, - "keywords": [], - "author": "", - "license": "ISC", - "dependencies": { - "body-parser": "^1.17.1", - "express": "^4.15.2", - "express-session": "^1.15.2", - "he": "^1.1.1" - } -} diff --git a/Chapter08/preventing-cross-site-request-forgery/attacker/index.js b/Chapter08/preventing-cross-site-request-forgery/attacker/index.js deleted file mode 100644 index 747e3e8..0000000 --- a/Chapter08/preventing-cross-site-request-forgery/attacker/index.js +++ /dev/null @@ -1,19 +0,0 @@ -const http = require('http') - -const attackerAc = '87654321' -const attackerSc = '11-11-11' -const attackerMsg = 'Everything you could ever want is only one click away' - -const server = http.createServer((req, res) => { - res.writeHead(200, {'Content-Type': 'text/html'}) - res.end(` - -
- - - -
- `) -}) - -server.listen(3001) \ No newline at end of file diff --git a/Chapter08/preventing-cross-site-request-forgery/fixed-app/index.js b/Chapter08/preventing-cross-site-request-forgery/fixed-app/index.js deleted file mode 100644 index 36aa5c9..0000000 --- a/Chapter08/preventing-cross-site-request-forgery/fixed-app/index.js +++ /dev/null @@ -1,83 +0,0 @@ -'use strict' - -const express = require('express') -const bodyParser = require('body-parser') -const session = require('express-session') -const he = require('he') -const app = express() - -const pretendData = { - dave: { - ac: '12345678', - sc: '88-26-26' - } -} - -app.use(session({ - secret: 'AI overlords are coming', - name: 'SESSIONID', - resave: false, - saveUninitialized: false, - cookie: { - sameSite: true - } -})) - -app.use(bodyParser.urlencoded({extended: false})) - -app.get('/', (req, res) => { - if (req.session.user) return res.redirect('/profile') - res.send(` -

Login

-
-
-
- -
- `) -}) - -app.post('/', (req, res) => { - if (req.body.user === 'dave' && req.body.pass === 'ncb') { - req.session.user = req.body.user - } - if (req.session.user) res.redirect('/profile') - else res.redirect('/') -}) - -app.get('/profile', (req, res) => { - if (!req.session.user) return res.redirect('/') - const {prev = '', handoverToken = '', lang = 'en'} = req.query - pretendDbQuery(req.session.user, (err, {sc, ac}) => { - if (err) { - res.sendStatus(500) - return - } - sc = he.encode(sc) - ac = he.encode(ac) - res.send(` -

Employee Payment Profile

-
-
-
- -
- `) - }) -}) - -app.post('/update', (req, res) => { - if (!req.session.user) return res.sendStatus(403) - pretendData[req.session.user].ac = req.body.ac - pretendData[req.session.user].sc = req.body.sc - res.send(` -

updated

- - `) -}) - -function pretendDbQuery (user, cb) { - cb(null, pretendData[user]) -} - -app.listen(3000) diff --git a/Chapter08/preventing-cross-site-request-forgery/fixed-app/package.json b/Chapter08/preventing-cross-site-request-forgery/fixed-app/package.json deleted file mode 100644 index b7d89f0..0000000 --- a/Chapter08/preventing-cross-site-request-forgery/fixed-app/package.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "name": "app", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" - }, - "keywords": [], - "author": "", - "license": "ISC", - "dependencies": { - "body-parser": "^1.17.1", - "express": "^4.15.2", - "express-session": "^1.15.2", - "he": "^1.1.1" - } -} diff --git a/Chapter08/preventing-cross-site-request-forgery/secured-app/index.js b/Chapter08/preventing-cross-site-request-forgery/secured-app/index.js deleted file mode 100644 index 90a8a22..0000000 --- a/Chapter08/preventing-cross-site-request-forgery/secured-app/index.js +++ /dev/null @@ -1,86 +0,0 @@ -'use strict' - -const express = require('express') -const bodyParser = require('body-parser') -const session = require('express-session') -const he = require('he') -const csurf = require('csurf') -const app = express() -const csrf = csurf() - -const pretendData = { - dave: { - ac: '12345678', - sc: '88-26-26' - } -} - -app.use(session({ - secret: 'AI overlords are coming', - name: 'SESSIONID', - resave: false, - saveUninitialized: false, - cookie: { - sameSite: true - } -})) - -app.use(bodyParser.urlencoded({extended: false})) - -app.get('/', (req, res) => { - if (req.session.user) return res.redirect('/profile') - res.send(` -

Login

-
-
-
- -
- `) -}) - -app.post('/', (req, res) => { - if (req.body.user === 'dave' && req.body.pass === 'ncb') { - req.session.user = req.body.user - } - if (req.session.user) res.redirect('/profile') - else res.redirect('/') -}) - -app.get('/profile', csrf, (req, res) => { - if (!req.session.user) return res.redirect('/') - const {prev = '', handoverToken = '', lang = 'en'} = req.query - pretendDbQuery(req.session.user, (err, {sc, ac}) => { - if (err) { - res.sendStatus(500) - return - } - sc = he.encode(sc) - ac = he.encode(ac) - res.send(` -

Employee Payment Profile

-
- -
-
- -
- `) - }) -}) - -app.post('/update', csrf, (req, res) => { - if (!req.session.user) return res.sendStatus(403) - pretendData[req.session.user].ac = req.body.ac - pretendData[req.session.user].sc = req.body.sc - res.send(` -

updated

- - `) -}) - -function pretendDbQuery (user, cb) { - cb(null, pretendData[user]) -} - -app.listen(3000) diff --git a/Chapter08/preventing-cross-site-request-forgery/secured-app/package.json b/Chapter08/preventing-cross-site-request-forgery/secured-app/package.json deleted file mode 100644 index 86cf66b..0000000 --- a/Chapter08/preventing-cross-site-request-forgery/secured-app/package.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "name": "app", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" - }, - "keywords": [], - "author": "", - "license": "ISC", - "dependencies": { - "body-parser": "^1.17.1", - "csurf": "^1.9.0", - "express": "^4.15.2", - "express-session": "^1.15.2", - "he": "^1.1.1" - } -} diff --git a/Chapter08/web-server-hardening/app/app.js b/Chapter08/web-server-hardening/app/app.js deleted file mode 100644 index 1e9ad86..0000000 --- a/Chapter08/web-server-hardening/app/app.js +++ /dev/null @@ -1,47 +0,0 @@ -var express = require('express') -var path = require('path') -var favicon = require('serve-favicon') -var logger = require('morgan') -var cookieParser = require('cookie-parser') -var bodyParser = require('body-parser') -var helmet = require('helmet') -var index = require('./routes/index') -var users = require('./routes/users') - -var app = express() - -// view engine setup -app.set('views', path.join(__dirname, 'views')) -app.set('view engine', 'jade') - -// uncomment after placing your favicon in /public -// app.use(favicon(path.join(__dirname, 'public', 'favicon.ico'))); -app.use(helmet()) -app.use(logger('dev')) -app.use(bodyParser.json()) -app.use(bodyParser.urlencoded({ extended: false })) -app.use(cookieParser()) -app.use(express.static(path.join(__dirname, 'public'))) - -app.use('/', index) -app.use('/users', users) - -// catch 404 and forward to error handler -app.use(function (req, res, next) { - var err = new Error('Not Found') - err.status = 404 - next(err) -}) - -// error handler -app.use(function (err, req, res, next) { - // set locals, only providing error in development - res.locals.message = err.message - res.locals.error = req.app.get('env') === 'development' ? err : {} - - // render the error page - res.status(err.status || 500) - res.render('error') -}) - -module.exports = app diff --git a/Chapter08/web-server-hardening/app/bin/www b/Chapter08/web-server-hardening/app/bin/www deleted file mode 100644 index a8c2d36..0000000 --- a/Chapter08/web-server-hardening/app/bin/www +++ /dev/null @@ -1,90 +0,0 @@ -#!/usr/bin/env node - -/** - * Module dependencies. - */ - -var app = require('../app'); -var debug = require('debug')('app:server'); -var http = require('http'); - -/** - * Get port from environment and store in Express. - */ - -var port = normalizePort(process.env.PORT || '3000'); -app.set('port', port); - -/** - * Create HTTP server. - */ - -var server = http.createServer(app); - -/** - * Listen on provided port, on all network interfaces. - */ - -server.listen(port); -server.on('error', onError); -server.on('listening', onListening); - -/** - * Normalize a port into a number, string, or false. - */ - -function normalizePort(val) { - var port = parseInt(val, 10); - - if (isNaN(port)) { - // named pipe - return val; - } - - if (port >= 0) { - // port number - return port; - } - - return false; -} - -/** - * Event listener for HTTP server "error" event. - */ - -function onError(error) { - if (error.syscall !== 'listen') { - throw error; - } - - var bind = typeof port === 'string' - ? 'Pipe ' + port - : 'Port ' + port; - - // handle specific listen errors with friendly messages - switch (error.code) { - case 'EACCES': - console.error(bind + ' requires elevated privileges'); - process.exit(1); - break; - case 'EADDRINUSE': - console.error(bind + ' is already in use'); - process.exit(1); - break; - default: - throw error; - } -} - -/** - * Event listener for HTTP server "listening" event. - */ - -function onListening() { - var addr = server.address(); - var bind = typeof addr === 'string' - ? 'pipe ' + addr - : 'port ' + addr.port; - debug('Listening on ' + bind); -} diff --git a/Chapter08/web-server-hardening/app/package.json b/Chapter08/web-server-hardening/app/package.json deleted file mode 100644 index 35569d5..0000000 --- a/Chapter08/web-server-hardening/app/package.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "name": "app", - "version": "0.0.0", - "private": true, - "scripts": { - "start": "node ./bin/www" - }, - "dependencies": { - "body-parser": "~1.16.0", - "cookie-parser": "~1.4.3", - "debug": "~2.6.0", - "express": "~4.14.1", - "helmet": "^3.5.0", - "jade": "~1.11.0", - "morgan": "~1.7.0", - "serve-favicon": "~2.3.2" - } -} diff --git a/Chapter08/web-server-hardening/app/public/stylesheets/style.css b/Chapter08/web-server-hardening/app/public/stylesheets/style.css deleted file mode 100644 index 9453385..0000000 --- a/Chapter08/web-server-hardening/app/public/stylesheets/style.css +++ /dev/null @@ -1,8 +0,0 @@ -body { - padding: 50px; - font: 14px "Lucida Grande", Helvetica, Arial, sans-serif; -} - -a { - color: #00B7FF; -} diff --git a/Chapter08/web-server-hardening/app/routes/index.js b/Chapter08/web-server-hardening/app/routes/index.js deleted file mode 100644 index 956680b..0000000 --- a/Chapter08/web-server-hardening/app/routes/index.js +++ /dev/null @@ -1,9 +0,0 @@ -var express = require('express') -var router = express.Router() - -/* GET home page. */ -router.get('/', function (req, res, next) { - res.render('index', { title: 'Express' }) -}) - -module.exports = router diff --git a/Chapter08/web-server-hardening/app/routes/users.js b/Chapter08/web-server-hardening/app/routes/users.js deleted file mode 100644 index 8cfe88f..0000000 --- a/Chapter08/web-server-hardening/app/routes/users.js +++ /dev/null @@ -1,9 +0,0 @@ -var express = require('express') -var router = express.Router() - -/* GET users listing. */ -router.get('/', function (req, res, next) { - res.send('respond with a resource') -}) - -module.exports = router diff --git a/Chapter08/web-server-hardening/app/views/error.jade b/Chapter08/web-server-hardening/app/views/error.jade deleted file mode 100644 index 51ec12c..0000000 --- a/Chapter08/web-server-hardening/app/views/error.jade +++ /dev/null @@ -1,6 +0,0 @@ -extends layout - -block content - h1= message - h2= error.status - pre #{error.stack} diff --git a/Chapter08/web-server-hardening/app/views/index.jade b/Chapter08/web-server-hardening/app/views/index.jade deleted file mode 100644 index 3d63b9a..0000000 --- a/Chapter08/web-server-hardening/app/views/index.jade +++ /dev/null @@ -1,5 +0,0 @@ -extends layout - -block content - h1= title - p Welcome to #{title} diff --git a/Chapter08/web-server-hardening/app/views/layout.jade b/Chapter08/web-server-hardening/app/views/layout.jade deleted file mode 100644 index 15af079..0000000 --- a/Chapter08/web-server-hardening/app/views/layout.jade +++ /dev/null @@ -1,7 +0,0 @@ -doctype html -html - head - title= title - link(rel='stylesheet', href='/stylesheets/style.css') - body - block content diff --git a/Chapter08/web-server-hardening/hapi-app/.gitignore b/Chapter08/web-server-hardening/hapi-app/.gitignore deleted file mode 100644 index 40b878d..0000000 --- a/Chapter08/web-server-hardening/hapi-app/.gitignore +++ /dev/null @@ -1 +0,0 @@ -node_modules/ \ No newline at end of file diff --git a/Chapter08/web-server-hardening/hapi-app/LICENSE b/Chapter08/web-server-hardening/hapi-app/LICENSE deleted file mode 100644 index b253f47..0000000 --- a/Chapter08/web-server-hardening/hapi-app/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2017 Azaritech - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/Chapter08/web-server-hardening/hapi-app/README.md b/Chapter08/web-server-hardening/hapi-app/README.md deleted file mode 100644 index 1fb3729..0000000 --- a/Chapter08/web-server-hardening/hapi-app/README.md +++ /dev/null @@ -1,21 +0,0 @@ -# hapi-starter-kit -Starter kit for Hapi - -## Install -```bash -git clone git@github.com:azaritech/hapi-starter-kit.git -cd hapi-starter-kit/ -yarn install -# or -npm install -``` - -## Start -```bash -npm run start -``` - -### Open browser and go to -[http://localhost:3000/](http://localhost:3000/) - -[http://localhost:3000/hello](http://localhost:3000/hello) diff --git a/Chapter08/web-server-hardening/hapi-app/config/default.json b/Chapter08/web-server-hardening/hapi-app/config/default.json deleted file mode 100644 index cc83a42..0000000 --- a/Chapter08/web-server-hardening/hapi-app/config/default.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "connections": - [ - { - "server": { - "port": 3000, - "host": "0.0.0.0", - "labels": ["server"] - } - } - ] -} \ No newline at end of file diff --git a/Chapter08/web-server-hardening/hapi-app/lib/index.js b/Chapter08/web-server-hardening/hapi-app/lib/index.js deleted file mode 100644 index 5b9dab6..0000000 --- a/Chapter08/web-server-hardening/hapi-app/lib/index.js +++ /dev/null @@ -1,34 +0,0 @@ -'use strict'; - -const util = require('util'); -const hapi = require('hapi'); -const config = require('getconfig'); - -const init = require('./init'); -const server = new hapi.Server(); - -// init connections before registering plugins -init.connections(server, config); -server.ext('onPreResponse', (request, reply) => { - var response = request.response.isBoom ? - request.response.output : - request.response; - response.headers['X-DNS-Prefetch-Control'] = 'off'; - response.headers['X-DNS-Prefetch-Control'] = 'off'; - response.headers['X-Frame-Options'] = 'SAMEORIGIN'; - response.headers['X-Download-Options'] = 'noopen'; - response.headers['X-Content-Type-Options'] = 'nosniff'; - response.headers['X-XSS-Protection'] = '1; mode=block'; - reply.continue(); -}); -// register plugins -init.registers(server); -// loading views -init.views(server); - -server.start((err) => { - if (err) { - throw err; - } - server.log('info', 'Server running'); -}); \ No newline at end of file diff --git a/Chapter08/web-server-hardening/hapi-app/lib/init.js b/Chapter08/web-server-hardening/hapi-app/lib/init.js deleted file mode 100644 index 071838a..0000000 --- a/Chapter08/web-server-hardening/hapi-app/lib/init.js +++ /dev/null @@ -1,39 +0,0 @@ -'use strict'; - -module.exports.connections = function(server, config) { - require('./server').connection(server, config); -}; - -module.exports.registers = function(server) { - server.register([{ - register: require('./logs').register, - options: require('./logs').options - }, { - register: require('nes') - }, { - register: require('vision') - }, { - register: require('inert') - }, { - register: require('./server').register, - select: ['server'] - }], (err) => { - if (err) { - throw err; - } - }); -}; - -module.exports.views = function(server) { - server.views({ - engines: { - html: require('handlebars') - }, - path: __dirname + '/views', - layout: false - //layoutPath: 'views/layout', - //layout: 'default', - //helpersPath: 'views/helpers', - //partialsPath: 'views/partials' - }); -} \ No newline at end of file diff --git a/Chapter08/web-server-hardening/hapi-app/lib/logs.js b/Chapter08/web-server-hardening/hapi-app/lib/logs.js deleted file mode 100644 index 3e0d146..0000000 --- a/Chapter08/web-server-hardening/hapi-app/lib/logs.js +++ /dev/null @@ -1,21 +0,0 @@ -'use strict'; - -// logging to console -const logs = { - register: require('good'), - options: { - ops: { - interval: 60 * 1000 - }, - reporters: { - console: [{ - module: 'good-console', - args: [ { log: '*', response: '*', request: '*' } ] - }, - 'stdout' - ] - } - } -}; - -module.exports = logs; \ No newline at end of file diff --git a/Chapter08/web-server-hardening/hapi-app/lib/server/index.js b/Chapter08/web-server-hardening/hapi-app/lib/server/index.js deleted file mode 100644 index 8d3b4ef..0000000 --- a/Chapter08/web-server-hardening/hapi-app/lib/server/index.js +++ /dev/null @@ -1,19 +0,0 @@ -'use strict'; - -module.exports.connection = function(server, config) { - server.connection({ - host: config.connections[0].server.host, - port: config.connections[0].server.port, - labels: config.connections[0].server.labels - }); -}; - -// register plugin -module.exports.register = function (server, options, next) { - require('./routes')(server); - next(); -}; - -module.exports.register.attributes = { - pkg: require('./package.json') -}; \ No newline at end of file diff --git a/Chapter08/web-server-hardening/hapi-app/lib/server/package.json b/Chapter08/web-server-hardening/hapi-app/lib/server/package.json deleted file mode 100644 index 69a979e..0000000 --- a/Chapter08/web-server-hardening/hapi-app/lib/server/package.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "name": "server", - "version": "1.0.0" -} \ No newline at end of file diff --git a/Chapter08/web-server-hardening/hapi-app/lib/server/routes.js b/Chapter08/web-server-hardening/hapi-app/lib/server/routes.js deleted file mode 100644 index 2eb3f5d..0000000 --- a/Chapter08/web-server-hardening/hapi-app/lib/server/routes.js +++ /dev/null @@ -1,22 +0,0 @@ -'use strict'; - -module.exports = function(server) { - server.route({ - method: 'GET', - path: '/', - handler: function (request, reply) { - reply.view('index'); - } - }); - server.route({ - method: 'GET', - path: '/hello', - handler: function (request, reply) { - const data = { - message1: 'Hello', - message2: 'Paris, France' - }; - reply.view('hello', data); - } - }); -}; diff --git a/Chapter08/web-server-hardening/hapi-app/lib/views/hello.html b/Chapter08/web-server-hardening/hapi-app/lib/views/hello.html deleted file mode 100644 index e5ea604..0000000 --- a/Chapter08/web-server-hardening/hapi-app/lib/views/hello.html +++ /dev/null @@ -1 +0,0 @@ -{{message1}} from {{message2}}. \ No newline at end of file diff --git a/Chapter08/web-server-hardening/hapi-app/lib/views/index.html b/Chapter08/web-server-hardening/hapi-app/lib/views/index.html deleted file mode 100644 index a403e71..0000000 --- a/Chapter08/web-server-hardening/hapi-app/lib/views/index.html +++ /dev/null @@ -1 +0,0 @@ -Hapi Starter Kit \ No newline at end of file diff --git a/Chapter08/web-server-hardening/hapi-app/package.json b/Chapter08/web-server-hardening/hapi-app/package.json deleted file mode 100644 index 8ae93a3..0000000 --- a/Chapter08/web-server-hardening/hapi-app/package.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "name": "hapi-starter-kit", - "version": "1.0.2", - "description": "Starter kit for Hapi", - "main": "lib/index.js", - "repository": "git@github.com:azaritech/hapi-starter-kit.git", - "author": "Nicolas Azari", - "license": "MIT", - "scripts": { - "start": "node lib/index.js", - "test": "echo \"Error: no test specified\" && exit 1" - }, - "dependencies": { - "getconfig": "^3.0.0", - "good": "^7.1.0", - "good-console": "^6.4.0", - "handlebars": "^4.0.6", - "hapi": "^16.1.0", - "inert": "^4.1.0", - "nes": "^6.4.0", - "vision": "^4.1.1" - }, - "devDependencies": {} -} diff --git a/Chapter08/web-server-hardening/hapi-app/yarn.lock b/Chapter08/web-server-hardening/hapi-app/yarn.lock deleted file mode 100644 index 8ef51d4..0000000 --- a/Chapter08/web-server-hardening/hapi-app/yarn.lock +++ /dev/null @@ -1,551 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -accept@2.x.x: - version "2.1.3" - resolved "https://registry.yarnpkg.com/accept/-/accept-2.1.3.tgz#ab0f5bda4c449bbe926aea607b3522562f5acf86" - dependencies: - boom "4.x.x" - hoek "4.x.x" - -align-text@^0.1.1, align-text@^0.1.3: - version "0.1.4" - resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117" - dependencies: - kind-of "^3.0.2" - longest "^1.0.1" - repeat-string "^1.5.2" - -amdefine@>=0.0.4: - version "1.0.1" - resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" - -ammo@2.x.x: - version "2.0.3" - resolved "https://registry.yarnpkg.com/ammo/-/ammo-2.0.3.tgz#914bbcf65b043ed0f58a8a9d0196e250ec51e6a7" - dependencies: - boom "4.x.x" - hoek "4.x.x" - -async@^1.4.0: - version "1.5.2" - resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" - -async@~0.2.6: - version "0.2.10" - resolved "https://registry.yarnpkg.com/async/-/async-0.2.10.tgz#b6bbe0b0674b9d719708ca38de8c237cb526c3d1" - -b64@3.x.x: - version "3.0.2" - resolved "https://registry.yarnpkg.com/b64/-/b64-3.0.2.tgz#7a9d60466adf7b8de114cbdf651a5fdfcc90894d" - -boom@4.x.x: - version "4.2.0" - resolved "https://registry.yarnpkg.com/boom/-/boom-4.2.0.tgz#c1a74174b11fbba223f6162d4fd8851a1b82a536" - dependencies: - hoek "4.x.x" - -buffer-shims@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/buffer-shims/-/buffer-shims-1.0.0.tgz#9978ce317388c649ad8793028c3477ef044a8b51" - -call@3.x.x: - version "3.0.4" - resolved "https://registry.yarnpkg.com/call/-/call-3.0.4.tgz#e380f2f2a491330aa79085355f8be080877d559e" - dependencies: - boom "4.x.x" - hoek "4.x.x" - -call@4.x.x: - version "4.0.0" - resolved "https://registry.yarnpkg.com/call/-/call-4.0.0.tgz#cd29381a98046a132db26e2628e70bd8321a1ddf" - dependencies: - boom "4.x.x" - hoek "4.x.x" - -camelcase@^1.0.2: - version "1.2.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" - -catbox-memory@2.x.x: - version "2.0.4" - resolved "https://registry.yarnpkg.com/catbox-memory/-/catbox-memory-2.0.4.tgz#433e255902caf54233d1286429c8f4df14e822d5" - dependencies: - hoek "4.x.x" - -catbox@7.x.x: - version "7.1.3" - resolved "https://registry.yarnpkg.com/catbox/-/catbox-7.1.3.tgz#9817edec5a921743282addfc9c45ace52847eebb" - dependencies: - boom "4.x.x" - hoek "4.x.x" - joi "10.x.x" - -center-align@^0.1.1: - version "0.1.3" - resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad" - dependencies: - align-text "^0.1.3" - lazy-cache "^1.0.3" - -cliui@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1" - dependencies: - center-align "^0.1.1" - right-align "^0.1.1" - wordwrap "0.0.2" - -content@3.x.x: - version "3.0.3" - resolved "https://registry.yarnpkg.com/content/-/content-3.0.3.tgz#000f8a01371b95c66afe99be9390fa6cb91aa87a" - dependencies: - boom "4.x.x" - -core-util-is@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" - -cryptiles@3.x.x: - version "3.1.1" - resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-3.1.1.tgz#86a9203f7367a0e9324bc7555ff0fcf5f81979ee" - dependencies: - boom "4.x.x" - -decamelize@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" - -duplexify@^3.1.2: - version "3.5.0" - resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.5.0.tgz#1aa773002e1578457e9d9d4a50b0ccaaebcbd604" - dependencies: - end-of-stream "1.0.0" - inherits "^2.0.1" - readable-stream "^2.0.0" - stream-shift "^1.0.0" - -end-of-stream@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.0.0.tgz#d4596e702734a93e40e9af864319eabd99ff2f0e" - dependencies: - once "~1.3.0" - -end-of-stream@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.1.0.tgz#e9353258baa9108965efc41cb0ef8ade2f3cfb07" - dependencies: - once "~1.3.0" - -getconfig@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/getconfig/-/getconfig-3.0.0.tgz#e74ca2581d5ec805f8778e1236569453a0f0ae1d" - -good-console@^6.4.0: - version "6.4.0" - resolved "https://registry.yarnpkg.com/good-console/-/good-console-6.4.0.tgz#7294c9d90c4c9f059a082e180625495966d2ba59" - dependencies: - hoek "4.x.x" - joi "8.1.x" - json-stringify-safe "5.0.x" - moment "2.15.x" - -good@^7.1.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/good/-/good-7.1.0.tgz#9e05ad24c58a11b71cf5081700f3778db0b22c1c" - dependencies: - hoek "4.x.x" - joi "10.x.x" - oppsy "1.x.x" - pumpify "1.3.x" - -handlebars@^4.0.6: - version "4.0.6" - resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.6.tgz#2ce4484850537f9c97a8026d5399b935c4ed4ed7" - dependencies: - async "^1.4.0" - optimist "^0.6.1" - source-map "^0.4.4" - optionalDependencies: - uglify-js "^2.6" - -hapi@^16.1.0: - version "16.1.0" - resolved "https://registry.yarnpkg.com/hapi/-/hapi-16.1.0.tgz#419dd86347588821eb5a0a5f493bce019802d33b" - dependencies: - accept "2.x.x" - ammo "2.x.x" - boom "4.x.x" - call "4.x.x" - catbox "7.x.x" - catbox-memory "2.x.x" - cryptiles "3.x.x" - heavy "4.x.x" - hoek "4.x.x" - iron "4.x.x" - items "2.x.x" - joi "10.x.x" - mimos "3.x.x" - podium "^1.2.x" - shot "3.x.x" - statehood "5.x.x" - subtext "^4.3.x" - topo "2.x.x" - -heavy@4.x.x: - version "4.0.3" - resolved "https://registry.yarnpkg.com/heavy/-/heavy-4.0.3.tgz#976bba118b011b15fe904aa4f292a168bfc6232f" - dependencies: - boom "4.x.x" - hoek "4.x.x" - joi "10.x.x" - -hoek@4.x.x: - version "4.1.0" - resolved "https://registry.yarnpkg.com/hoek/-/hoek-4.1.0.tgz#4a4557460f69842ed463aa00628cc26d2683afa7" - -inert@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/inert/-/inert-4.1.0.tgz#e68df9fb0b87d8ad688e3428daaf35d623b64f5d" - dependencies: - ammo "2.x.x" - boom "4.x.x" - hoek "4.x.x" - items "2.x.x" - joi "10.x.x" - lru-cache "4.0.x" - -inherits@^2.0.1, inherits@~2.0.1: - version "2.0.3" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" - -iron@4.x.x: - version "4.0.4" - resolved "https://registry.yarnpkg.com/iron/-/iron-4.0.4.tgz#c1f8cc4c91454194ab8920d9247ba882e528061a" - dependencies: - boom "4.x.x" - cryptiles "3.x.x" - hoek "4.x.x" - -is-buffer@^1.0.2: - version "1.1.4" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.4.tgz#cfc86ccd5dc5a52fa80489111c6920c457e2d98b" - -isarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - -isemail@2.x.x: - version "2.2.1" - resolved "https://registry.yarnpkg.com/isemail/-/isemail-2.2.1.tgz#0353d3d9a62951080c262c2aa0a42b8ea8e9e2a6" - -items@2.x.x, items@^2.1.x: - version "2.1.1" - resolved "https://registry.yarnpkg.com/items/-/items-2.1.1.tgz#8bd16d9c83b19529de5aea321acaada78364a198" - -joi@10.x.x: - version "10.2.2" - resolved "https://registry.yarnpkg.com/joi/-/joi-10.2.2.tgz#dc5a792b7b4c6fffa562242a95b55d9d3f077e24" - dependencies: - hoek "4.x.x" - isemail "2.x.x" - items "2.x.x" - topo "2.x.x" - -joi@8.1.x: - version "8.1.1" - resolved "https://registry.yarnpkg.com/joi/-/joi-8.1.1.tgz#2d8b52a5d909d217ed47248577eefe8b1798f48f" - dependencies: - hoek "4.x.x" - isemail "2.x.x" - moment "2.x.x" - topo "2.x.x" - -json-stringify-safe@5.0.x: - version "5.0.1" - resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" - -kind-of@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.1.0.tgz#475d698a5e49ff5e53d14e3e732429dc8bf4cf47" - dependencies: - is-buffer "^1.0.2" - -lazy-cache@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" - -longest@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" - -lru-cache@4.0.x: - version "4.0.2" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.0.2.tgz#1d17679c069cda5d040991a09dbc2c0db377e55e" - dependencies: - pseudomap "^1.0.1" - yallist "^2.0.0" - -mime-db@1.x.x: - version "1.26.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.26.0.tgz#eaffcd0e4fc6935cf8134da246e2e6c35305adff" - -mimos@3.x.x: - version "3.0.3" - resolved "https://registry.yarnpkg.com/mimos/-/mimos-3.0.3.tgz#b9109072ad378c2b72f6a0101c43ddfb2b36641f" - dependencies: - hoek "4.x.x" - mime-db "1.x.x" - -minimist@~0.0.1: - version "0.0.10" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" - -moment@2.15.x, moment@2.x.x: - version "2.15.2" - resolved "https://registry.yarnpkg.com/moment/-/moment-2.15.2.tgz#1bfdedf6a6e345f322fe956d5df5bd08a8ce84dc" - -nes@^6.4.0: - version "6.4.0" - resolved "https://registry.yarnpkg.com/nes/-/nes-6.4.0.tgz#35831781df19cbe5a8014169bbd70887bc5c63d0" - dependencies: - boom "4.x.x" - call "3.x.x" - cryptiles "3.x.x" - hoek "4.x.x" - iron "4.x.x" - items "^2.1.x" - joi "10.x.x" - ws "1.x.x" - -nigel@2.x.x: - version "2.0.2" - resolved "https://registry.yarnpkg.com/nigel/-/nigel-2.0.2.tgz#93a1866fb0c52d87390aa75e2b161f4b5c75e5b1" - dependencies: - hoek "4.x.x" - vise "2.x.x" - -once@^1.3.1: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - dependencies: - wrappy "1" - -once@~1.3.0: - version "1.3.3" - resolved "https://registry.yarnpkg.com/once/-/once-1.3.3.tgz#b2e261557ce4c314ec8304f3fa82663e4297ca20" - dependencies: - wrappy "1" - -oppsy@1.x.x: - version "1.0.2" - resolved "https://registry.yarnpkg.com/oppsy/-/oppsy-1.0.2.tgz#98014cd6967653a83cfffa554226dc90050baad4" - dependencies: - hoek "4.x.x" - items "2.x.x" - -optimist@^0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" - dependencies: - minimist "~0.0.1" - wordwrap "~0.0.2" - -options@>=0.0.5: - version "0.0.6" - resolved "https://registry.yarnpkg.com/options/-/options-0.0.6.tgz#ec22d312806bb53e731773e7cdaefcf1c643128f" - -pez@2.x.x: - version "2.1.4" - resolved "https://registry.yarnpkg.com/pez/-/pez-2.1.4.tgz#73f822fa62d599d65c4606f490d54d345191bc7c" - dependencies: - b64 "3.x.x" - boom "4.x.x" - content "3.x.x" - hoek "4.x.x" - nigel "2.x.x" - -podium@^1.2.x: - version "1.2.5" - resolved "https://registry.yarnpkg.com/podium/-/podium-1.2.5.tgz#87c566c2f0365bcf0a1ec7602c4d01948cdd2ad5" - dependencies: - hoek "4.x.x" - items "2.x.x" - joi "10.x.x" - -process-nextick-args@~1.0.6: - version "1.0.7" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" - -pseudomap@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" - -pump@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/pump/-/pump-1.0.2.tgz#3b3ee6512f94f0e575538c17995f9f16990a5d51" - dependencies: - end-of-stream "^1.1.0" - once "^1.3.1" - -pumpify@1.3.x: - version "1.3.5" - resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.3.5.tgz#1b671c619940abcaeac0ad0e3a3c164be760993b" - dependencies: - duplexify "^3.1.2" - inherits "^2.0.1" - pump "^1.0.0" - -readable-stream@^2.0.0: - version "2.2.2" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.2.2.tgz#a9e6fec3c7dda85f8bb1b3ba7028604556fc825e" - dependencies: - buffer-shims "^1.0.0" - core-util-is "~1.0.0" - inherits "~2.0.1" - isarray "~1.0.0" - process-nextick-args "~1.0.6" - string_decoder "~0.10.x" - util-deprecate "~1.0.1" - -repeat-string@^1.5.2: - version "1.6.1" - resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" - -right-align@^0.1.1: - version "0.1.3" - resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef" - dependencies: - align-text "^0.1.1" - -shot@3.x.x: - version "3.4.0" - resolved "https://registry.yarnpkg.com/shot/-/shot-3.4.0.tgz#e7125ee72575ae5218349e933636808d790d4b92" - dependencies: - hoek "4.x.x" - joi "10.x.x" - -source-map@^0.4.4: - version "0.4.4" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b" - dependencies: - amdefine ">=0.0.4" - -source-map@~0.5.1: - version "0.5.6" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412" - -statehood@5.x.x: - version "5.0.1" - resolved "https://registry.yarnpkg.com/statehood/-/statehood-5.0.1.tgz#fc13c97b37751c18e70513d2b97e896ac8b73005" - dependencies: - boom "4.x.x" - cryptiles "3.x.x" - hoek "4.x.x" - iron "4.x.x" - items "2.x.x" - joi "10.x.x" - -stream-shift@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.0.tgz#d5c752825e5367e786f78e18e445ea223a155952" - -string_decoder@~0.10.x: - version "0.10.31" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" - -subtext@^4.3.x: - version "4.3.0" - resolved "https://registry.yarnpkg.com/subtext/-/subtext-4.3.0.tgz#dfac90492ec35669fd6e00c6e5d938b06d7ccfbb" - dependencies: - boom "4.x.x" - content "3.x.x" - hoek "4.x.x" - pez "2.x.x" - wreck "10.x.x" - -topo@2.x.x: - version "2.0.2" - resolved "https://registry.yarnpkg.com/topo/-/topo-2.0.2.tgz#cd5615752539057c0dc0491a621c3bc6fbe1d182" - dependencies: - hoek "4.x.x" - -uglify-js@^2.6: - version "2.7.5" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.7.5.tgz#4612c0c7baaee2ba7c487de4904ae122079f2ca8" - dependencies: - async "~0.2.6" - source-map "~0.5.1" - uglify-to-browserify "~1.0.0" - yargs "~3.10.0" - -uglify-to-browserify@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" - -ultron@1.0.x: - version "1.0.2" - resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.0.2.tgz#ace116ab557cd197386a4e88f4685378c8b2e4fa" - -util-deprecate@~1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - -vise@2.x.x: - version "2.0.2" - resolved "https://registry.yarnpkg.com/vise/-/vise-2.0.2.tgz#6b08e8fb4cb76e3a50cd6dd0ec37338e811a0d39" - dependencies: - hoek "4.x.x" - -vision@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/vision/-/vision-4.1.1.tgz#e1b612b2d2e2f20310a039290fd49d51248f82da" - dependencies: - boom "4.x.x" - hoek "4.x.x" - items "2.x.x" - joi "10.x.x" - -window-size@0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" - -wordwrap@0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" - -wordwrap@~0.0.2: - version "0.0.3" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" - -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - -wreck@10.x.x: - version "10.0.0" - resolved "https://registry.yarnpkg.com/wreck/-/wreck-10.0.0.tgz#98ab882f85e16a526332507f101f5a7841162278" - dependencies: - boom "4.x.x" - hoek "4.x.x" - -ws@1.x.x: - version "1.1.2" - resolved "https://registry.yarnpkg.com/ws/-/ws-1.1.2.tgz#8a244fa052401e08c9886cf44a85189e1fd4067f" - dependencies: - options ">=0.0.5" - ultron "1.0.x" - -yallist@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.0.0.tgz#306c543835f09ee1a4cb23b7bce9ab341c91cdd4" - -yargs@~3.10.0: - version "3.10.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" - dependencies: - camelcase "^1.0.2" - cliui "^2.1.0" - decamelize "^1.0.0" - window-size "0.1.0" diff --git a/Chapter08/web-server-hardening/http-app/index.js b/Chapter08/web-server-hardening/http-app/index.js deleted file mode 100644 index f6a2a09..0000000 --- a/Chapter08/web-server-hardening/http-app/index.js +++ /dev/null @@ -1,25 +0,0 @@ -const http = require('http') - -const server = http.createServer((req, res) => { - secureHeaders(res) - switch (req.url) { - case '/': return res.end('hello world') - case '/users': return res.end('oh, some users!') - default: return error('404', res) - } -}) - -function secureHeaders (res) { - res.setHeader('X-DNS-Prefetch-Control', 'off') - res.setHeader('X-Frame-Options', 'SAMEORIGIN') - res.setHeader('X-Download-Options', 'noopen') - res.setHeader('X-Content-Type-Options', 'nosniff') - res.setHeader('X-XSS-Protection', '1; mode=block') -} - -function error(code, res) { - res.statusCode = code - res.end(http.STATUS_CODES[code]) -} - -server.listen(3000) \ No newline at end of file diff --git a/Chapter08/web-server-hardening/koa-app/app.js b/Chapter08/web-server-hardening/koa-app/app.js deleted file mode 100644 index 569f219..0000000 --- a/Chapter08/web-server-hardening/koa-app/app.js +++ /dev/null @@ -1,61 +0,0 @@ -const Koa = require('koa') -const helmet = require('koa-helmet') -const app = new Koa() -const router = require('koa-router')() -const views = require('koa-views') -const co = require('co') -const json = require('koa-json') -const onerror = require('koa-onerror') -const bodyparser = require('koa-bodyparser') -const serve = require('koa-static') -const path = require('path') -const log4js = require('koa-log4') -const logger = log4js.getLogger('app') - -const index = require('./routes/index') -const users = require('./routes/users') - -// middlewares -app.use(helmet()) -app.use(bodyparser()) -app.use(json()) -app.use(log4js.koaLogger(log4js.getLogger('http'), { level: 'auto' })) -app.use(serve(path.join(__dirname, 'public'))) - -// handle error -onerror(app) - -// setup view -app.use(views(path.join(__dirname, 'views'), { - extension: 'jade' -})) - -// logger -// app.use(async (ctx, next) => { -// const start = new Date() -// await next() -// const ms = new Date() - start -// logger.info(`${ctx.method} ${ctx.url} - ${ms}ms`) -// }) -app.use(co.wrap(function * (ctx, next) { - const start = new Date() - yield next() - const ms = new Date() - start - logger.info(`${ctx.method} ${ctx.url} - ${ms}ms`) -})) - -// routes definition -router.use('/', index.routes(), index.allowedMethods()) -router.use('/users', users.routes(), users.allowedMethods()) - -// mount root routes -app.use(router.routes()) - .use(router.allowedMethods()) - -// log error -app.on('error', function (err, ctx) { - logger.error(err) - logger.error('server error', err, ctx) -}) - -module.exports = app diff --git a/Chapter08/web-server-hardening/koa-app/bin/www b/Chapter08/web-server-hardening/koa-app/bin/www deleted file mode 100644 index d8f1386..0000000 --- a/Chapter08/web-server-hardening/koa-app/bin/www +++ /dev/null @@ -1,106 +0,0 @@ -#!/usr/bin/env node - -/** - * Module dependencies. - */ - -const app = require('../app') -const http = require('http') -const path = require('path') - -const appDir = path.resolve(__dirname, '..') -const logDir = path.join(appDir, 'logs') -/** - * make a log directory, just in case it isn't there. - */ -try { - require('fs').mkdirSync(logDir) -} catch (e) { - if (e.code !== 'EEXIST') { - console.error('Could not set up log directory, error was: ', e) - process.exit(1) - } -} -const log4js = require('koa-log4') -log4js.configure(path.join(appDir, 'log4js.json'), { cwd: logDir }) -const logger = log4js.getLogger('startup') -/** - * Get port from environment and store in Express. - */ - -var port = normalizePort(process.env.PORT || '3000') -// app.set('port', port) - -/** - * Create HTTP server. - */ - -var server = http.createServer(app.callback()) - -/** - * Listen on provided port, on all network interfaces. - */ - -server.listen(port) -server.on('error', onError) -server.on('listening', onListening) - -/** - * Normalize a port into a number, string, or false. - */ - -function normalizePort (val) { - var port = parseInt(val, 10) - - if (isNaN(port)) { - // named pipe - return val - } - - if (port >= 0) { - // port number - return port - } - - return false -} - -/** - * Event listener for HTTP server "error" event. - */ - -function onError (error) { - if (error.syscall !== 'listen') { - throw error - } - - var bind = typeof port === 'string' - ? 'Pipe ' + port - : 'Port ' + port - - // handle specific listen errors with friendly messages - switch (error.code) { - case 'EACCES': - logger.error(bind + ' requires elevated privileges') - process.exit(1) - break - case 'EADDRINUSE': - logger.error(bind + ' is already in use') - process.exit(1) - break - default: - throw error - } -} - -/** - * Event listener for HTTP server "listening" event. - */ - -function onListening () { - var addr = server.address() - var bind = typeof addr === 'string' - ? 'pipe ' + addr - : 'port ' + addr.port - logger.info('Listening on ' + bind) -} diff --git a/Chapter08/web-server-hardening/koa-app/gulpfile.js b/Chapter08/web-server-hardening/koa-app/gulpfile.js deleted file mode 100644 index c54a01a..0000000 --- a/Chapter08/web-server-hardening/koa-app/gulpfile.js +++ /dev/null @@ -1,66 +0,0 @@ -var gulp = require('gulp') -var nodemon = require('gulp-nodemon') -var sourcemaps = require('gulp-sourcemaps') -var concat = require('gulp-concat') -var uglify = require('gulp-uglify') -var cssmin = require('gulp-cssmin') -var del = require('del') -var path = require('path') - -var client = { - js: { - src: 'client/js', - dest: 'public/js' - }, - css: { - src: 'client/css', - dest: 'public/css' - } -} - -gulp.task('default', ['jsmin', 'cssmin', 'start']) - -gulp.task('start', function () { - nodemon({ - script: 'bin/www', - ext: 'js css ejs', - ignore: ['public', 'logs'], - tasks: function (files) { - var tasks = [] - files.forEach(function (file) { - if (path.relative(client.js.src, file).substr(0, 2) !== '..' - && !~tasks.indexOf('jsmin')) { - tasks.push('jsmin') - } - if (path.relative(client.css.src, file).substr(0, 2) !== '..' - && !~tasks.indexOf('cssmin')) { - tasks.push('cssmin') - } - }) - return tasks - } - }) -}) - -gulp.task('cleanjs', function () { - return del([client.js.dest]) -}) - -gulp.task('cleancss', function () { - return del([client.css.dest]) -}) - -gulp.task('jsmin', ['cleanjs'], function () { - return gulp.src(client.js.src + '/**/*.js') - .pipe(sourcemaps.init()) - .pipe(concat('graph.js')) - .pipe(uglify()) - .pipe(gulp.dest(client.js.dest)) -}) - -gulp.task('cssmin', ['cleancss'], function () { - return gulp.src(client.css.src + '/**/*.css') - .pipe(concat('style.css')) - .pipe(cssmin()) - .pipe(gulp.dest(client.css.dest)) -}) diff --git a/Chapter08/web-server-hardening/koa-app/log4js.json b/Chapter08/web-server-hardening/koa-app/log4js.json deleted file mode 100644 index febe3b5..0000000 --- a/Chapter08/web-server-hardening/koa-app/log4js.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "appenders": [ - { - "type": "console" - }, - { - "type": "clustered", - "appenders": [ - { - "type": "dateFile", - "filename": "startup.log", - "pattern": "-yyyy-MM-dd", - "category": "startup" - }, - { - "type": "dateFile", - "filename": "http.log", - "pattern": "-yyyy-MM-dd", - "category": "http" - }, - { - "type": "file", - "filename": "app.log", - "maxLogSize": 10485760, - "numBackups": 5 - }, - { - "type": "logLevelFilter", - "level": "ERROR", - "appender": { - "type": "file", - "filename": "errors.log" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/Chapter08/web-server-hardening/koa-app/package.json b/Chapter08/web-server-hardening/koa-app/package.json deleted file mode 100644 index 8b18f50..0000000 --- a/Chapter08/web-server-hardening/koa-app/package.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "name": "koa-app", - "version": "0.0.0", - "private": true, - "scripts": { - "start": "node ./bin/www", - "test": "gulp" - }, - "dependencies": { - "co": "^4.6.0", - "jade": "~1.11.0", - "koa": "^2.0.0", - "koa-bodyparser": "^3.0.0", - "koa-helmet": "^3.1.0", - "koa-json": "^2.0.0", - "koa-log4": "^2.0.1", - "koa-onerror": "^1.2.1", - "koa-router": "^7.0.0", - "koa-static": "^3.0.0", - "koa-views": "^5.0.1" - }, - "devDependencies": { - "del": "^2.2.0", - "gulp": "^3.9.1", - "gulp-concat": "^2.6.0", - "gulp-cssmin": "^0.1.7", - "gulp-nodemon": "^2.0.6", - "gulp-sourcemaps": "^1.6.0", - "gulp-uglify": "^1.5.3" - } -} diff --git a/Chapter08/web-server-hardening/koa-app/public/stylesheets/style.css b/Chapter08/web-server-hardening/koa-app/public/stylesheets/style.css deleted file mode 100644 index 9453385..0000000 --- a/Chapter08/web-server-hardening/koa-app/public/stylesheets/style.css +++ /dev/null @@ -1,8 +0,0 @@ -body { - padding: 50px; - font: 14px "Lucida Grande", Helvetica, Arial, sans-serif; -} - -a { - color: #00B7FF; -} diff --git a/Chapter08/web-server-hardening/koa-app/routes/index.js b/Chapter08/web-server-hardening/koa-app/routes/index.js deleted file mode 100644 index b0bbe62..0000000 --- a/Chapter08/web-server-hardening/koa-app/routes/index.js +++ /dev/null @@ -1,19 +0,0 @@ -const co = require('co') -const router = require('koa-router')() - -router.get('/', co.wrap(function *(ctx, next) { - ctx.state = { - title: 'Welcome to Koa' - } - yield ctx.render('index', {}) -})) - -// router.get('/', async function (ctx, next) { -// ctx.state = { -// title: 'koa2 title' -// } -// -// await ctx.render('index', { -// }) -// }) -module.exports = router diff --git a/Chapter08/web-server-hardening/koa-app/routes/users.js b/Chapter08/web-server-hardening/koa-app/routes/users.js deleted file mode 100644 index eae6d06..0000000 --- a/Chapter08/web-server-hardening/koa-app/routes/users.js +++ /dev/null @@ -1,7 +0,0 @@ -const router = require('koa-router')() - -router.get('/', function (ctx, next) { - ctx.body = 'this a users response!' -}) - -module.exports = router diff --git a/Chapter08/web-server-hardening/koa-app/views/error.jade b/Chapter08/web-server-hardening/koa-app/views/error.jade deleted file mode 100644 index 51ec12c..0000000 --- a/Chapter08/web-server-hardening/koa-app/views/error.jade +++ /dev/null @@ -1,6 +0,0 @@ -extends layout - -block content - h1= message - h2= error.status - pre #{error.stack} diff --git a/Chapter08/web-server-hardening/koa-app/views/index.jade b/Chapter08/web-server-hardening/koa-app/views/index.jade deleted file mode 100644 index 3d63b9a..0000000 --- a/Chapter08/web-server-hardening/koa-app/views/index.jade +++ /dev/null @@ -1,5 +0,0 @@ -extends layout - -block content - h1= title - p Welcome to #{title} diff --git a/Chapter08/web-server-hardening/koa-app/views/layout.jade b/Chapter08/web-server-hardening/koa-app/views/layout.jade deleted file mode 100644 index 15af079..0000000 --- a/Chapter08/web-server-hardening/koa-app/views/layout.jade +++ /dev/null @@ -1,7 +0,0 @@ -doctype html -html - head - title= title - link(rel='stylesheet', href='/stylesheets/style.css') - body - block content diff --git a/Chapter09/async-opt/calculate-average.js b/Chapter09/async-opt/calculate-average.js deleted file mode 100644 index 302b357..0000000 --- a/Chapter09/async-opt/calculate-average.js +++ /dev/null @@ -1,23 +0,0 @@ -'use strict' - -const MongoClient = require('mongodb').MongoClient -const url = 'mongodb://localhost:27017/test'; -var count = 0 -var max = 1000 - -MongoClient.connect(url, function(err, db) { - if (err) { throw err } - const collection = db.collection('data') - const average = db.collection('averages') - - collection.find({}).toArray(function (err, data) { - if (err) { throw err } - average.insert({ - value: data.reduce((acc, v) => acc + v, 0) / data.length - }, function (err) { - if (err) { throw err } - db.close() - }) - }) -}) - diff --git a/Chapter09/async-opt/load.js b/Chapter09/async-opt/load.js deleted file mode 100644 index d1c2285..0000000 --- a/Chapter09/async-opt/load.js +++ /dev/null @@ -1,26 +0,0 @@ -'use strict' - -const MongoClient = require('mongodb').MongoClient -const url = 'mongodb://localhost:27017/test'; -var count = 0 -var max = 1000 - -MongoClient.connect(url, function(err, db) { - if (err) { throw err } - const collection = db.collection('data') - - function insert (err) { - if (err) throw err - - if (count++ === max) { - return db.close() - } - - collection.insert({ - value: Math.random() * 1000000 - }, insert) - } - - insert() -}) - diff --git a/Chapter09/async-opt/package.json b/Chapter09/async-opt/package.json deleted file mode 100644 index fc82b7b..0000000 --- a/Chapter09/async-opt/package.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "name": "async-opt", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" - }, - "author": "", - "license": "ISC", - "dependencies": { - "express": "^4.14.0", - "fastq": "^1.4.1", - "lru-cache": "^4.0.1", - "mongodb": "^2.1.18" - } -} diff --git a/Chapter09/async-opt/server-average.js b/Chapter09/async-opt/server-average.js deleted file mode 100644 index 863a0de..0000000 --- a/Chapter09/async-opt/server-average.js +++ /dev/null @@ -1,19 +0,0 @@ -'use strict' - -const MongoClient = require('mongodb').MongoClient -const express = require('express') -const app = express() - -var url = 'mongodb://localhost:27017/test'; - -MongoClient.connect(url, function(err, db) { - if (err) { throw err } - const collection = db.collection('data') - app.get('/hello', (req, res) => { - collection.findOne({}, function sum (err, data) { - res.send('' + data.value) - }) - }) - - app.listen(3000) -}) diff --git a/Chapter09/async-opt/server-cache.js b/Chapter09/async-opt/server-cache.js deleted file mode 100644 index 61e0818..0000000 --- a/Chapter09/async-opt/server-cache.js +++ /dev/null @@ -1,56 +0,0 @@ -'use strict' - -const MongoClient = require('mongodb').MongoClient -const express = require('express') -const LRU = require('lru-cache') -const fastq = require('fastq') -const app = express() - -var url = 'mongodb://localhost:27017/test'; - -function sum (data) { - var sum = 0 - const l = data.length - for (var i = 0; i < l; i++) { - sum += data[i].value - } - return sum -} - -MongoClient.connect(url, function(err, db) { - if (err) { throw err } - const collection = db.collection('data') - const queue = fastq(work) - const cache = LRU({ - maxAge: 1000 * 5 // 5 seconds - }) - - function work (req, done) { - const elem = cache.get('average') - if (elem) { - done(null, elem) - return - } - collection.find({}).toArray(function (err, data) { - if (err) { - done(err) - return - } - const result = sum(data) / data.length - cache.set('average', result) - done(null, result) - }) - } - - app.get('/hello', (req, res) => { - queue.push(req, function (err, result) { - if (err) { - res.send(err.message) - return - } - res.send('' + result) - }) - }) - - app.listen(3000) -}) diff --git a/Chapter09/async-opt/server-no-reduce.js b/Chapter09/async-opt/server-no-reduce.js deleted file mode 100644 index f0f5db3..0000000 --- a/Chapter09/async-opt/server-no-reduce.js +++ /dev/null @@ -1,29 +0,0 @@ -'use strict' - -const MongoClient = require('mongodb').MongoClient -const express = require('express') -const app = express() - -var url = 'mongodb://localhost:27017/test' - -MongoClient.connect(url, function(err, db) { - if (err) { throw err } - const collection = db.collection('data') - app.get('/hello', (req, res) => { - collection.find({}).toArray(function sum (err, data) { - if (err) { - res.send(err) - return - } - var sum = 0 - const l = data.length - for (var i = 0; i < l; i++) { - sum += data[i].value - } - const result = sum / data.length - res.send('' + result) - }) - }) - - app.listen(3000) -}) \ No newline at end of file diff --git a/Chapter09/async-opt/server-one-sum-fn.js b/Chapter09/async-opt/server-one-sum-fn.js deleted file mode 100644 index d828303..0000000 --- a/Chapter09/async-opt/server-one-sum-fn.js +++ /dev/null @@ -1,33 +0,0 @@ -'use strict' - -const MongoClient = require('mongodb').MongoClient -const express = require('express') -const app = express() - -var url = 'mongodb://localhost:27017/test'; - -function sum (data) { - var sum = 0 - const l = data.length - for (var i = 0; i < l; i++) { - sum += data[i].value - } - return sum -} - -MongoClient.connect(url, function(err, db) { - if (err) { throw err } - const collection = db.collection('data') - app.get('/hello', (req, res) => { - collection.find({}).toArray(function (err, data) { - if (err) { - res.send(err) - return - } - const result = sum(data) / data.length - res.send('' + result) - }) - }) - - app.listen(3000) -}) diff --git a/Chapter09/async-opt/server.js b/Chapter09/async-opt/server.js deleted file mode 100644 index 26c8f62..0000000 --- a/Chapter09/async-opt/server.js +++ /dev/null @@ -1,26 +0,0 @@ -'use strict' - -const MongoClient = require('mongodb').MongoClient -const express = require('express') -const app = express() - -var url = 'mongodb://localhost:27017/test'; - - -MongoClient.connect(url, function(err, db) { - if (err) { throw err } - const collection = db.collection('data') - app.get('/hello', (req, res) => { - collection.find({}).toArray(function sum (err, data) { - if (err) { - res.send(err) - return - } - const total = data.reduce((acc, d) => acc + d.value, 0) - const result = total / data.length - res.send('' + result) - }) - }) - - app.listen(3000) -}) diff --git a/Chapter09/async-opt/server2.js b/Chapter09/async-opt/server2.js deleted file mode 100644 index 85b1ec4..0000000 --- a/Chapter09/async-opt/server2.js +++ /dev/null @@ -1,27 +0,0 @@ -'use strict' - -const MongoClient = require('mongodb').MongoClient -const express = require('express') -const app = express() - -var url = 'mongodb://localhost:27017/test'; - - -MongoClient.connect(url, function(err, db) { - if (err) { throw err } - const collection = db.collection('data') - app.get('/hello', (req, res) => { - var count = 0 - var result = 0 - collection.find({}) - .on('data', function (chunk) { - count++ - result += chunk.value - }) - .on('end', function () { - res.send('' + (result / count)) - }) - }) - - app.listen(3000) -}) diff --git a/Chapter09/bench-http/measuring-post-performance/package.json b/Chapter09/bench-http/measuring-post-performance/package.json deleted file mode 100644 index 3865d17..0000000 --- a/Chapter09/bench-http/measuring-post-performance/package.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "name": "bench-http", - "version": "0.0.1", - "description": "", - "main": "server.js", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" - }, - "author": "", - "license": "UNLICENSED", - "dependencies": { - "body-parser": "^1.15.2", - "express": "^4.13.4" - } -} diff --git a/Chapter09/bench-http/measuring-post-performance/server.js b/Chapter09/bench-http/measuring-post-performance/server.js deleted file mode 100644 index 13bdf4e..0000000 --- a/Chapter09/bench-http/measuring-post-performance/server.js +++ /dev/null @@ -1,14 +0,0 @@ -'use strict' - -const express = require('express') -const bodyParser = require('body-parser') -const app = express() - -app.use(bodyParser.json()) -app.use(bodyParser.urlencoded({extended: false})) - -app.post('/echo', (req, res) => { - res.send(req.body) -}) - -app.listen(3000) diff --git a/Chapter09/bench-http/package.json b/Chapter09/bench-http/package.json deleted file mode 100644 index 13e3c65..0000000 --- a/Chapter09/bench-http/package.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "name": "bench-http", - "version": "0.0.1", - "description": "", - "main": "server.js", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" - }, - "author": "", - "license": "UNLICENSED", - "dependencies": { - "express": "^4.13.4" - } -} diff --git a/Chapter09/bench-http/profiling-for-production/package.json b/Chapter09/bench-http/profiling-for-production/package.json deleted file mode 100644 index e7fb00e..0000000 --- a/Chapter09/bench-http/profiling-for-production/package.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "name": "bench-http", - "version": "0.0.1", - "description": "", - "main": "server.js", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" - }, - "author": "", - "license": "UNLICENSED", - "dependencies": { - "express": "^4.13.4", - "jade": "^1.11.0" - } -} diff --git a/Chapter09/bench-http/profiling-for-production/server.js b/Chapter09/bench-http/profiling-for-production/server.js deleted file mode 100644 index 2a499b2..0000000 --- a/Chapter09/bench-http/profiling-for-production/server.js +++ /dev/null @@ -1,14 +0,0 @@ -'use strict' - -const express = require('express') -const path = require('path') -const app = express() - -app.set('views', path.join(__dirname, 'views')); -app.set('view engine', 'jade'); - -app.get('/hello', (req, res) => { - res.render('hello', { title: 'Express' }); -}) - -app.listen(3000) diff --git a/Chapter09/bench-http/profiling-for-production/views/hello.jade b/Chapter09/bench-http/profiling-for-production/views/hello.jade deleted file mode 100644 index b3dd2e7..0000000 --- a/Chapter09/bench-http/profiling-for-production/views/hello.jade +++ /dev/null @@ -1,7 +0,0 @@ -doctype html -html - head - title= title - link(rel='stylesheet', href='/stylesheets/style.css') - body - h1= title diff --git a/Chapter09/bench-http/server.js b/Chapter09/bench-http/server.js deleted file mode 100644 index ad8c0d6..0000000 --- a/Chapter09/bench-http/server.js +++ /dev/null @@ -1,10 +0,0 @@ -'use strict' - -const express = require('express') -const app = express() - -app.get('/hello', (req, res) => { - res.send('hello world') -}) - -app.listen(3000) diff --git a/Chapter09/hello-server/package.json b/Chapter09/hello-server/package.json deleted file mode 100644 index 5dfcc8c..0000000 --- a/Chapter09/hello-server/package.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "name": "hello-server", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" - }, - "keywords": [], - "author": "David Mark Clements", - "license": "MIT", - "dependencies": { - "express": "^4.14.0", - "jade": "^1.11.0" - } -} diff --git a/Chapter09/hello-server/server.js b/Chapter09/hello-server/server.js deleted file mode 100644 index 413b1dc..0000000 --- a/Chapter09/hello-server/server.js +++ /dev/null @@ -1,12 +0,0 @@ -const express = require('express') -const path = require('path') -const app = express() - -app.set('views', path.join(__dirname, 'views')); -app.set('view engine', 'jade'); - -app.get('/hello', (req, res) => { - res.render('hello', { title: 'Express' }); -}) - -app.listen(3000) diff --git a/Chapter09/hello-server/views/hello.jade b/Chapter09/hello-server/views/hello.jade deleted file mode 100644 index b3dd2e7..0000000 --- a/Chapter09/hello-server/views/hello.jade +++ /dev/null @@ -1,7 +0,0 @@ -doctype html -html - head - title= title - link(rel='stylesheet', href='/stylesheets/style.css') - body - h1= title diff --git a/Chapter09/name-server/climem-enabled/index.js b/Chapter09/name-server/climem-enabled/index.js deleted file mode 100644 index 45485f8..0000000 --- a/Chapter09/name-server/climem-enabled/index.js +++ /dev/null @@ -1,16 +0,0 @@ -const http = require('http') -const starwarsName = require('starwars-names').random -const names = {} - -http.createServer((req, res) => { - res.end(`Your unique name is: ${createName(req)} \n`) -}).listen(8080) - -function createName () { - var result = starwarsName() - if (names[result]) { - result += names[result]++ - } - names[result] = 1 - return result -} \ No newline at end of file diff --git a/Chapter09/name-server/climem-enabled/package.json b/Chapter09/name-server/climem-enabled/package.json deleted file mode 100644 index 4b1d390..0000000 --- a/Chapter09/name-server/climem-enabled/package.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "name": "name-server", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" - }, - "keywords": [], - "author": "David Mark Clements", - "license": "MIT", - "dependencies": { - "starwars-names": "^1.6.0" - }, - "devDependencies": { - "climem": "^1.0.2" - } -} diff --git a/Chapter09/name-server/index.js b/Chapter09/name-server/index.js deleted file mode 100644 index 45485f8..0000000 --- a/Chapter09/name-server/index.js +++ /dev/null @@ -1,16 +0,0 @@ -const http = require('http') -const starwarsName = require('starwars-names').random -const names = {} - -http.createServer((req, res) => { - res.end(`Your unique name is: ${createName(req)} \n`) -}).listen(8080) - -function createName () { - var result = starwarsName() - if (names[result]) { - result += names[result]++ - } - names[result] = 1 - return result -} \ No newline at end of file diff --git a/Chapter09/name-server/non-leaky/index.js b/Chapter09/name-server/non-leaky/index.js deleted file mode 100644 index 62f7c4a..0000000 --- a/Chapter09/name-server/non-leaky/index.js +++ /dev/null @@ -1,15 +0,0 @@ -const http = require('http') -const starwarsName = require('starwars-names').random -const names = {} - -http.createServer((req, res) => { - res.end(`Your unique name is: ${createName(req)} \n`) -}).listen(8080) - -function createName () { - var result = starwarsName() - names[result] = names[result] ? - names[result] + 1 : - 1 - return result + names[result] -} \ No newline at end of file diff --git a/Chapter09/name-server/non-leaky/package.json b/Chapter09/name-server/non-leaky/package.json deleted file mode 100644 index cc9bf3f..0000000 --- a/Chapter09/name-server/non-leaky/package.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "name": "name-server", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" - }, - "keywords": [], - "author": "David Mark Clements", - "license": "MIT", - "dependencies": { - "sillyname": "^0.1.0" - } -} diff --git a/Chapter09/name-server/package.json b/Chapter09/name-server/package.json deleted file mode 100644 index 854c33b..0000000 --- a/Chapter09/name-server/package.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "name": "name-server", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" - }, - "keywords": [], - "author": "David Mark Clements", - "license": "MIT", - "dependencies": { - "starwars-names": "^1.6.0" - } -} diff --git a/Chapter09/placeholder.deleteme b/Chapter09/placeholder.deleteme deleted file mode 100644 index e69de29..0000000 diff --git a/Chapter09/sync-opt/bench.js b/Chapter09/sync-opt/bench.js deleted file mode 100644 index 3b9d63c..0000000 --- a/Chapter09/sync-opt/bench.js +++ /dev/null @@ -1,33 +0,0 @@ -'use strict' - -const benchmark = require('benchmark') -const slow = require('./slow') -const noCollection = require('./no-collections') - -const suite = new benchmark.Suite() - -const numbers = [] - -for (let i = 0; i < 1000; i++) { - numbers.push(Math.random() * i) -} - -suite.add('slow', function () { - slow(12, numbers) -}) - -suite.add('no-collections', function () { - noCollection(12, numbers) -}) - -suite.on('complete', print) - -suite.run() - -function print () { - for (var i = 0; i < this.length; i++) { - console.log(this[i].toString()) - } - - console.log('Fastest is', this.filter('fastest').map('name')[0]) -} diff --git a/Chapter09/sync-opt/checking-optimization-status/bench.js b/Chapter09/sync-opt/checking-optimization-status/bench.js deleted file mode 100644 index 6562c99..0000000 --- a/Chapter09/sync-opt/checking-optimization-status/bench.js +++ /dev/null @@ -1,42 +0,0 @@ -'use strict' - -const benchmark = require('benchmark') -const slow = require('./slow') -const noCollection = require('./no-collections') -const noTryCatch = require('./no-try-catch') -const funcStatus = require('./func-status') - -const suite = new benchmark.Suite() - -const numbers = [] - -for (let i = 0; i < 1000; i++) { - numbers.push(Math.random() * i) -} - -suite.add('slow', function () { - slow(12, numbers) -}) - -suite.add('no-collections', function () { - noCollection(12, numbers) -}) - -suite.add('no-try-catch', function () { - noTryCatch(12, numbers) -}) - -suite.on('complete', print) - -suite.run() - -function print () { - for (var i = 0; i < this.length; i++) { - console.log(this[i].toString()) - } - funcStatus('slow', slow) - funcStatus('noCollection', noCollection) - funcStatus('noTryCatch', noTryCatch) - - console.log('Fastest is', this.filter('fastest').map('name')[0]) -} diff --git a/Chapter09/sync-opt/checking-optimization-status/func-status.js b/Chapter09/sync-opt/checking-optimization-status/func-status.js deleted file mode 100644 index 0c66940..0000000 --- a/Chapter09/sync-opt/checking-optimization-status/func-status.js +++ /dev/null @@ -1,15 +0,0 @@ -'use strict' - -function printStatus (name, fn) { - switch(%GetOptimizationStatus(fn)) { - case 1: console.log(`${name} function is optimized`); break; - case 2: console.log(`${name} function is not optimized`); break; - case 3: console.log(`${name} function is always optimized`); break; - case 4: console.log(`${name} function is never optimized`); break; - case 6: console.log(`${name} function is maybe deoptimized`); break; - case 7: console.log(`${name} function is optimized by TurboFan`); break; - default: console.log(`${name} function optimization status unknown`); break; - } -} - -module.exports = printStatus diff --git a/Chapter09/sync-opt/checking-optimization-status/no-collections-vs-no-try-catch.js b/Chapter09/sync-opt/checking-optimization-status/no-collections-vs-no-try-catch.js deleted file mode 100644 index 651a1a7..0000000 --- a/Chapter09/sync-opt/checking-optimization-status/no-collections-vs-no-try-catch.js +++ /dev/null @@ -1,28 +0,0 @@ -'use strict' - -const benchmark = require('benchmark') -const noCollection = require('./no-collections') - -const suite = new benchmark.Suite() - -const numbers = [] - -for (let i = 0; i < 1000; i++) { - numbers.push(Math.random() * i) -} - -suite.add('no-collections', function () { - noCollection(12, numbers) -}) - -suite.on('complete', print) - -suite.run() - -function print () { - for (var i = 0; i < this.length; i++) { - console.log(this[i].toString()) - } - - console.log('Fastest is', this.filter('fastest').map('name')[0]) -} diff --git a/Chapter09/sync-opt/checking-optimization-status/no-collections.js b/Chapter09/sync-opt/checking-optimization-status/no-collections.js deleted file mode 100644 index e93243c..0000000 --- a/Chapter09/sync-opt/checking-optimization-status/no-collections.js +++ /dev/null @@ -1,15 +0,0 @@ -'use strict' - -function divideByAndSum (num, array) { - var result = 0 - try { - for (var i = 0; i < array.length; i++) { - result += array[i] / num - } - } catch (err) { - // to guard for division by zero - return 0 - } -} - -module.exports = divideByAndSum diff --git a/Chapter09/sync-opt/checking-optimization-status/no-try-catch-bench.js b/Chapter09/sync-opt/checking-optimization-status/no-try-catch-bench.js deleted file mode 100644 index 91ffffd..0000000 --- a/Chapter09/sync-opt/checking-optimization-status/no-try-catch-bench.js +++ /dev/null @@ -1,28 +0,0 @@ -'use strict' - -const benchmark = require('benchmark') -const noTryCatch = require('./no-try-catch') - -const suite = new benchmark.Suite() - -const numbers = [] - -for (let i = 0; i < 1000; i++) { - numbers.push(Math.random() * i) -} - -suite.add('no-try-catch', function () { - noTryCatch(12, numbers) -}) - -suite.on('complete', print) - -suite.run() - -function print () { - for (var i = 0; i < this.length; i++) { - console.log(this[i].toString()) - } - - console.log('Fastest is', this.filter('fastest').map('name')[0]) -} diff --git a/Chapter09/sync-opt/checking-optimization-status/no-try-catch.js b/Chapter09/sync-opt/checking-optimization-status/no-try-catch.js deleted file mode 100644 index 213026b..0000000 --- a/Chapter09/sync-opt/checking-optimization-status/no-try-catch.js +++ /dev/null @@ -1,17 +0,0 @@ -'use strict' - -function divideByAndSum (num, array) { - var result = 0 - - if (num === 0) { - return 0 - } - - for (var i = 0; i < array.length; i++) { - result += array[i] / num - } - - return result -} - -module.exports = divideByAndSum diff --git a/Chapter09/sync-opt/checking-optimization-status/slow.js b/Chapter09/sync-opt/checking-optimization-status/slow.js deleted file mode 100644 index f3f38f0..0000000 --- a/Chapter09/sync-opt/checking-optimization-status/slow.js +++ /dev/null @@ -1,16 +0,0 @@ -'use strict' - -function divideByAndSum (num, array) { - try { - array.map(function (item) { - return item / num - }).reduce(function (acc, item) { - return acc + item - }, 0) - } catch (err) { - // to guard for division by zero - return 0 - } -} - -module.exports = divideByAndSum diff --git a/Chapter09/sync-opt/function-inlining/bench.js b/Chapter09/sync-opt/function-inlining/bench.js deleted file mode 100644 index 01ec5f7..0000000 --- a/Chapter09/sync-opt/function-inlining/bench.js +++ /dev/null @@ -1,38 +0,0 @@ -'use strict' - -const benchmark = require('benchmark') -const slow = require('./slow') -const noCollection = require('./no-collections') -const noTryCatch = require('./no-try-catch') - -const suite = new benchmark.Suite() - -const numbers = [] - -for (let i = 0; i < 1000; i++) { - numbers.push(Math.random() * i) -} - -suite.add('slow', function () { - slow(12, numbers) -}) - -suite.add('no-collections', function () { - noCollection(12, numbers) -}) - -suite.add('no-try-catch', function () { - noTryCatch(12, numbers) -}) - -suite.on('complete', print) - -suite.run() - -function print () { - for (var i = 0; i < this.length; i++) { - console.log(this[i].toString()) - } - - console.log('Fastest is', this.filter('fastest').map('name')[0]) -} diff --git a/Chapter09/sync-opt/function-inlining/initial-bench.js b/Chapter09/sync-opt/function-inlining/initial-bench.js deleted file mode 100644 index 03021cf..0000000 --- a/Chapter09/sync-opt/function-inlining/initial-bench.js +++ /dev/null @@ -1,29 +0,0 @@ -'use strict' - -const benchmark = require('benchmark') -const noCollection = require('./no-collections') -const noTryCatch = require('./no-try-catch') - -const suite = new benchmark.Suite() - -const numbers = [] - -for (let i = 0; i < 1000; i++) { - numbers.push(Math.random() * i) -} - -suite.add('no-collections', function () { - noCollection(12, numbers) -}) - -suite.on('complete', print) - -suite.run() - -function print () { - for (var i = 0; i < this.length; i++) { - console.log(this[i].toString()) - } - - console.log('Fastest is', this.filter('fastest').map('name')[0]) -} diff --git a/Chapter09/sync-opt/function-inlining/no-collections-vs-no-try-catch.js b/Chapter09/sync-opt/function-inlining/no-collections-vs-no-try-catch.js deleted file mode 100644 index 651a1a7..0000000 --- a/Chapter09/sync-opt/function-inlining/no-collections-vs-no-try-catch.js +++ /dev/null @@ -1,28 +0,0 @@ -'use strict' - -const benchmark = require('benchmark') -const noCollection = require('./no-collections') - -const suite = new benchmark.Suite() - -const numbers = [] - -for (let i = 0; i < 1000; i++) { - numbers.push(Math.random() * i) -} - -suite.add('no-collections', function () { - noCollection(12, numbers) -}) - -suite.on('complete', print) - -suite.run() - -function print () { - for (var i = 0; i < this.length; i++) { - console.log(this[i].toString()) - } - - console.log('Fastest is', this.filter('fastest').map('name')[0]) -} diff --git a/Chapter09/sync-opt/function-inlining/no-collections.js b/Chapter09/sync-opt/function-inlining/no-collections.js deleted file mode 100644 index e93243c..0000000 --- a/Chapter09/sync-opt/function-inlining/no-collections.js +++ /dev/null @@ -1,15 +0,0 @@ -'use strict' - -function divideByAndSum (num, array) { - var result = 0 - try { - for (var i = 0; i < array.length; i++) { - result += array[i] / num - } - } catch (err) { - // to guard for division by zero - return 0 - } -} - -module.exports = divideByAndSum diff --git a/Chapter09/sync-opt/function-inlining/no-try-catch-bench.js b/Chapter09/sync-opt/function-inlining/no-try-catch-bench.js deleted file mode 100644 index 91ffffd..0000000 --- a/Chapter09/sync-opt/function-inlining/no-try-catch-bench.js +++ /dev/null @@ -1,28 +0,0 @@ -'use strict' - -const benchmark = require('benchmark') -const noTryCatch = require('./no-try-catch') - -const suite = new benchmark.Suite() - -const numbers = [] - -for (let i = 0; i < 1000; i++) { - numbers.push(Math.random() * i) -} - -suite.add('no-try-catch', function () { - noTryCatch(12, numbers) -}) - -suite.on('complete', print) - -suite.run() - -function print () { - for (var i = 0; i < this.length; i++) { - console.log(this[i].toString()) - } - - console.log('Fastest is', this.filter('fastest').map('name')[0]) -} diff --git a/Chapter09/sync-opt/function-inlining/no-try-catch.js b/Chapter09/sync-opt/function-inlining/no-try-catch.js deleted file mode 100644 index 213026b..0000000 --- a/Chapter09/sync-opt/function-inlining/no-try-catch.js +++ /dev/null @@ -1,17 +0,0 @@ -'use strict' - -function divideByAndSum (num, array) { - var result = 0 - - if (num === 0) { - return 0 - } - - for (var i = 0; i < array.length; i++) { - result += array[i] / num - } - - return result -} - -module.exports = divideByAndSum diff --git a/Chapter09/sync-opt/function-inlining/slow.js b/Chapter09/sync-opt/function-inlining/slow.js deleted file mode 100644 index f3f38f0..0000000 --- a/Chapter09/sync-opt/function-inlining/slow.js +++ /dev/null @@ -1,16 +0,0 @@ -'use strict' - -function divideByAndSum (num, array) { - try { - array.map(function (item) { - return item / num - }).reduce(function (acc, item) { - return acc + item - }, 0) - } catch (err) { - // to guard for division by zero - return 0 - } -} - -module.exports = divideByAndSum diff --git a/Chapter09/sync-opt/initial-bench.js b/Chapter09/sync-opt/initial-bench.js deleted file mode 100644 index 3801655..0000000 --- a/Chapter09/sync-opt/initial-bench.js +++ /dev/null @@ -1,28 +0,0 @@ -'use strict' - -const benchmark = require('benchmark') -const slow = require('./slow') - -const suite = new benchmark.Suite() - -const numbers = [] - -for (let i = 0; i < 1000; i++) { - numbers.push(Math.random() * i) -} - -suite.add('slow', function () { - slow(12, numbers) -}) - -suite.on('complete', print) - -suite.run() - -function print () { - for (var i = 0; i < this.length; i++) { - console.log(this[i].toString()) - } - - console.log('Fastest is', this.filter('fastest').map('name')[0]) -} diff --git a/Chapter09/sync-opt/no-collections.js b/Chapter09/sync-opt/no-collections.js deleted file mode 100644 index e93243c..0000000 --- a/Chapter09/sync-opt/no-collections.js +++ /dev/null @@ -1,15 +0,0 @@ -'use strict' - -function divideByAndSum (num, array) { - var result = 0 - try { - for (var i = 0; i < array.length; i++) { - result += array[i] / num - } - } catch (err) { - // to guard for division by zero - return 0 - } -} - -module.exports = divideByAndSum diff --git a/Chapter09/sync-opt/package.json b/Chapter09/sync-opt/package.json deleted file mode 100644 index b0d4c6d..0000000 --- a/Chapter09/sync-opt/package.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "name": "sync-opt", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" - }, - "author": "", - "license": "ISC", - "dependencies": { - "benchmark": "^2.1.0" - } -} diff --git a/Chapter09/sync-opt/slow.js b/Chapter09/sync-opt/slow.js deleted file mode 100644 index f3f38f0..0000000 --- a/Chapter09/sync-opt/slow.js +++ /dev/null @@ -1,16 +0,0 @@ -'use strict' - -function divideByAndSum (num, array) { - try { - array.map(function (item) { - return item / num - }).reduce(function (acc, item) { - return acc + item - }, 0) - } catch (err) { - // to guard for division by zero - return 0 - } -} - -module.exports = divideByAndSum diff --git a/Chapter10/adding-a-queue-based-service/micro/adderservice/index.js b/Chapter10/adding-a-queue-based-service/micro/adderservice/index.js deleted file mode 100644 index 1f2d9cf..0000000 --- a/Chapter10/adding-a-queue-based-service/micro/adderservice/index.js +++ /dev/null @@ -1,7 +0,0 @@ -'use strict' - -const wiring = require('./wiring') -const service = require('./service')() - - -wiring(service) diff --git a/Chapter10/adding-a-queue-based-service/micro/adderservice/package.json b/Chapter10/adding-a-queue-based-service/micro/adderservice/package.json deleted file mode 100644 index 7cef23a..0000000 --- a/Chapter10/adding-a-queue-based-service/micro/adderservice/package.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "name": "adderservice", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "test": "tap test" - }, - "keywords": [], - "author": "Peter Elger", - "license": "ISC", - "dependencies": { - "restify": "^4.3.0" - }, - "devDependencies": { - "tap": "^10.3.1" - } -} diff --git a/Chapter10/adding-a-queue-based-service/micro/adderservice/service.js b/Chapter10/adding-a-queue-based-service/micro/adderservice/service.js deleted file mode 100644 index 9d0d175..0000000 --- a/Chapter10/adding-a-queue-based-service/micro/adderservice/service.js +++ /dev/null @@ -1,13 +0,0 @@ -'use strict' - -module.exports = service - -function service () { - function add (args, cb) { - const {first, second} = args - const result = (parseInt(first, 10) + parseInt(second, 10)) - cb(null, {result: result.toString()}) - } - - return { add } -} diff --git a/Chapter10/adding-a-queue-based-service/micro/adderservice/test/index.js b/Chapter10/adding-a-queue-based-service/micro/adderservice/test/index.js deleted file mode 100644 index 32c45e5..0000000 --- a/Chapter10/adding-a-queue-based-service/micro/adderservice/test/index.js +++ /dev/null @@ -1,13 +0,0 @@ -'use strict' - -const {test} = require('tap') -const service = require('../service')() - -test('test add', (t) => { - t.plan(2) - - service.add({first: 1, second: 2}, (err, answer) => { - t.error(err) - t.same(answer, {result: 3}) - }) -}) diff --git a/Chapter10/adding-a-queue-based-service/micro/adderservice/wiring.js b/Chapter10/adding-a-queue-based-service/micro/adderservice/wiring.js deleted file mode 100644 index 0ed018c..0000000 --- a/Chapter10/adding-a-queue-based-service/micro/adderservice/wiring.js +++ /dev/null @@ -1,27 +0,0 @@ -'use strict' - -const restify = require('restify') -const { ADDERSERVICE_SERVICE_PORT } = process.env - -module.exports = wiring - -function wiring (service) { - const server = restify.createServer() - - server.get('/add/:first/:second', (req, res, next) => { - service.add(req.params, (err, result) => { - if (err) { - res.send(err) - next() - return - } - res.send(200, result) - next() - }) - }) - - server.listen(ADDERSERVICE_SERVICE_PORT, '0.0.0.0', () => { - console.log('%s listening at %s', server.name, server.url) - }) -} - diff --git a/Chapter10/adding-a-queue-based-service/micro/auditservice/index.js b/Chapter10/adding-a-queue-based-service/micro/auditservice/index.js deleted file mode 100644 index 40a4677..0000000 --- a/Chapter10/adding-a-queue-based-service/micro/auditservice/index.js +++ /dev/null @@ -1,6 +0,0 @@ -'use strict' - -const wiring = require('./wiring') -const service = require('./service')() - -wiring(service) diff --git a/Chapter10/adding-a-queue-based-service/micro/auditservice/package.json b/Chapter10/adding-a-queue-based-service/micro/auditservice/package.json deleted file mode 100644 index d93b31e..0000000 --- a/Chapter10/adding-a-queue-based-service/micro/auditservice/package.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "name": "auditservice", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" - }, - "keywords": [], - "author": "Peter Elger", - "license": "ISC", - "dependencies": { - "concordant": "^0.2.1", - "mongo": "^0.1.0", - "restify": "^4.3.0" - } -} diff --git a/Chapter10/adding-a-queue-based-service/micro/auditservice/service.js b/Chapter10/adding-a-queue-based-service/micro/auditservice/service.js deleted file mode 100644 index c416e4c..0000000 --- a/Chapter10/adding-a-queue-based-service/micro/auditservice/service.js +++ /dev/null @@ -1,74 +0,0 @@ -'use strict' - -const { MongoClient } = require('mongodb') -const { dns } = require('concordant')() - -module.exports = service - -function service () { - - var db - - setup() - - function setup () { - const mongo = '_main._tcp.mongo.micro.svc.cluster.local' - - dns.resolve(mongo, (err, locs) => { - if (err) { - console.error(err) - return - } - const { host, port } = locs[0] - const url = `mongodb://${host}:${port}/audit` - MongoClient.connect(url, (err, client) => { - if (err) { - console.log('failed to connect to MongoDB retrying in 100ms') - setTimeout(setup, 100) - return - } - db = client - db.on('close', () => db = null) - }) - }) - } - - function append (args, cb) { - if (!db) { - cb(Error('No database connection')) - return - } - const audit = db.collection('audit') - const data = { - ts: Date.now(), - calc: args.calc, - result: args.calcResult - } - - audit.insert(data, (err, result) => { - if (err) { - cb(err) - return - } - cb(null, {result: result.toString()}) - }) - } - - function list (args, cb) { - if (!db) { - cb(Error('No database connection')) - return - } - const audit = db.collection('audit') - audit.find({}, {limit: 10}).toArray((err, docs) => { - if (err) { - cb(err) - return - } - cb(null, {list: docs}) - }) - } - - return { append, list } -} - diff --git a/Chapter10/adding-a-queue-based-service/micro/auditservice/wiring.js b/Chapter10/adding-a-queue-based-service/micro/auditservice/wiring.js deleted file mode 100644 index b18dce8..0000000 --- a/Chapter10/adding-a-queue-based-service/micro/auditservice/wiring.js +++ /dev/null @@ -1,39 +0,0 @@ -'use strict' - -const restify = require('restify') -const { AUDITSERVICE_SERVICE_PORT } = process.env - -module.exports = wiring - -function wiring (service) { - const server = restify.createServer() - - server.use(restify.bodyParser()) - - server.post('/append', (req, res, next) => { - service.append(req.params, (err, result) => { - if (err) { - res.send(err) - return - } - res.send(result) - next() - }) - }) - - server.get('/list', (req, res, next) => { - service.list(req.params, (err, result) => { - if (err) { - res.send(err) - return - } - res.send(200, result) - next() - }) - }) - - server.listen(AUDITSERVICE_SERVICE_PORT, '0.0.0.0', () => { - console.log('%s listening at %s', server.name, server.url) - }) -} - diff --git a/Chapter10/adding-a-queue-based-service/micro/eventservice/index.js b/Chapter10/adding-a-queue-based-service/micro/eventservice/index.js deleted file mode 100644 index df3a380..0000000 --- a/Chapter10/adding-a-queue-based-service/micro/eventservice/index.js +++ /dev/null @@ -1,5 +0,0 @@ -'use strict' - -const wiring = require('./wiring') -const service = require('./service')() -wiring(service) diff --git a/Chapter10/adding-a-queue-based-service/micro/eventservice/package.json b/Chapter10/adding-a-queue-based-service/micro/eventservice/package.json deleted file mode 100644 index d8a7d4b..0000000 --- a/Chapter10/adding-a-queue-based-service/micro/eventservice/package.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "name": "eventservice", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" - }, - "keywords": [], - "author": "Peter Elger", - "license": "ISC", - "dependencies": { - "concordant": "^0.2.1", - "mongo": "^0.1.0", - "redis": "^2.6.5", - "restify": "^4.3.0" - } -} diff --git a/Chapter10/adding-a-queue-based-service/micro/eventservice/service.js b/Chapter10/adding-a-queue-based-service/micro/eventservice/service.js deleted file mode 100644 index 4082d3e..0000000 --- a/Chapter10/adding-a-queue-based-service/micro/eventservice/service.js +++ /dev/null @@ -1,80 +0,0 @@ -'use strict' - -const { MongoClient } = require('mongodb') -const { dns } = require('concordant')() - -module.exports = service - -function service () { - var db - - setup() - - function setup () { - const mongo = '_main._tcp.mongo.micro.svc.cluster.local' - - dns.resolve(mongo, (err, locs) => { - if (err) { - console.error(err) - return - } - const { host, port } = locs[0] - const url = `mongodb://${host}:${port}/events` - MongoClient.connect(url, (err, client) => { - if (err) { - console.log('failed to connect to MongoDB retrying in 100ms') - setTimeout(setup, 100) - return - } - db = client - db.on('close', () => db = null) - }) - }) - } - - function record (args, cb) { - if (!db) { - cb(Error('No database connection')) - return - } - const events = db.collection('events') - const data = { - ts: Date.now(), - eventType: args.type, - url: args.url - } - events.insert(data, (err, result) => { - if (err) { - cb(err) - return - } - cb(null, result) - }) - } - - function summary (args, cb) { - if (!db) { - cb(Error('No database connection')) - return - } - const summary = {} - const events = db.collection('events') - events.find({}).toArray( (err, docs) => { - if (err) return cb(err) - - docs.forEach(function (doc) { - if (!(summary[doc.url])) { - summary[doc.url] = 1 - } else { - summary[doc.url]++ - } - }) - cb(null, summary) - }) - } - - return { - record: record, - summary: summary - } -} diff --git a/Chapter10/adding-a-queue-based-service/micro/eventservice/wiring.js b/Chapter10/adding-a-queue-based-service/micro/eventservice/wiring.js deleted file mode 100644 index b04ab35..0000000 --- a/Chapter10/adding-a-queue-based-service/micro/eventservice/wiring.js +++ /dev/null @@ -1,53 +0,0 @@ -'use strict' - -const { dns } = require('concordant')() -const redis = require('redis') -const QNAME = 'eventservice' - -module.exports = wiring - -function wiring (service) { - - const endpoint = '_main._tcp.redis.micro.svc.cluster.local' - - dns.resolve(endpoint, (err, locs) => { - if (err) { - console.log(err) - return - } - const { port, host } = locs[0] - pullFromQueue(redis.createClient(port, host)) - }) - - function pullFromQueue (client) { - client.brpop(QNAME, 5, function (err, data) { - if (err) console.error(err) - if (err || !data) { - pullFromQueue(client) - return - } - const msg = JSON.parse(data[1]) - const { action, returnPath } = msg - const cmd = service[action] - if (typeof cmd !== 'function') { - pullFromQueue(client) - return - } - cmd(msg, (err, result) => { - if (err) { - console.error(err) - pullFromQueue(client) - return - } - if (!returnPath) { - pullFromQueue(client) - return - } - client.lpush(returnPath, JSON.stringify(result), (err) => { - if (err) console.error(err) - pullFromQueue(client) - }) - }) - }) - } -} diff --git a/Chapter10/adding-a-queue-based-service/micro/fuge/fuge.yml b/Chapter10/adding-a-queue-based-service/micro/fuge/fuge.yml deleted file mode 100644 index 839ba34..0000000 --- a/Chapter10/adding-a-queue-based-service/micro/fuge/fuge.yml +++ /dev/null @@ -1,45 +0,0 @@ -fuge_global: - run_containers: true - dns_enabled: true - dns_host: 127.0.0.1 - dns_port: 53053 - dns_suffix: svc.cluster.local - dns_namespace: micro - tail: true - monitor: true - monitor_excludes: - - '**/node_modules/**' - - '**/.git/**' - - '**/*.log' -adderservice: - type: node - path: ../adderservice - run: node index.js - ports: - - main=8080 -auditservice: - type: process - path: ../auditservice - run: 'node index.js' - ports: - - main=8081 -eventservice: - type: process - path: ../eventservice - run: 'node index.js' -webapp: - type: process - path: ../webapp - run: npm start - ports: - - http=3000 -mongo: - image: mongo - type: container - ports: - - main=27017:27017 -redis: - image: redis - type: container - ports: - - main=6379:6379 diff --git a/Chapter10/adding-a-queue-based-service/micro/report/env.js b/Chapter10/adding-a-queue-based-service/micro/report/env.js deleted file mode 100644 index a4d26e9..0000000 --- a/Chapter10/adding-a-queue-based-service/micro/report/env.js +++ /dev/null @@ -1,17 +0,0 @@ -'use strict' - -// provides environment variable setup for concordant - -const env = { - DNS_NAMESPACE: 'micro', - DNS_SUFFIX: 'svc.cluster.local' -} - -if (process.env.NODE_ENV !== 'production') { - Object.assign(env, { - DNS_HOST: '127.0.0.1', - DNS_PORT: '53053' - }) -} - -Object.assign(process.env, env) \ No newline at end of file diff --git a/Chapter10/adding-a-queue-based-service/micro/report/index.js b/Chapter10/adding-a-queue-based-service/micro/report/index.js deleted file mode 100644 index b65b65a..0000000 --- a/Chapter10/adding-a-queue-based-service/micro/report/index.js +++ /dev/null @@ -1,43 +0,0 @@ -'use strict' -require('./env') -const { dns } = require('concordant')() -const redis = require('redis') -const CliTable = require('cli-table') -const QNAME = 'eventservice' -const RESPONSE_QUEUE = 'summary' -const ENDPOINT = '_main._tcp.redis.micro.svc.cluster.local' - -dns.resolve(ENDPOINT, report) - -function report (err, locs) { - if (err) { return console.log(err) } - const { port, host } = locs[0] - const client = redis.createClient(port, host) - const event = JSON.stringify({ - action: 'summary', - returnPath: RESPONSE_QUEUE - }) - - client.lpush(QNAME, event, (err) => { - if (err) { - console.error(err) - return - } - - client.brpop(RESPONSE_QUEUE, 5, (err, data) => { - if (err) { - console.error(err) - return - } - const summary = JSON.parse(data[1]) - const cols = Object.keys(summary).map((url) => [url, summary[url]]) - const table = new CliTable({ - head: ['url', 'count'], - colWidths: [50, 10] - }) - table.push(...cols) - console.log(table.toString()) - client.quit() - }) - }) -} \ No newline at end of file diff --git a/Chapter10/adding-a-queue-based-service/micro/report/package.json b/Chapter10/adding-a-queue-based-service/micro/report/package.json deleted file mode 100644 index f22e52e..0000000 --- a/Chapter10/adding-a-queue-based-service/micro/report/package.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "name": "report", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" - }, - "keywords": [], - "author": "Peter Elger", - "license": "ISC", - "dependencies": { - "cli-table": "^0.3.1", - "concordant": "^0.2.1", - "redis": "^2.6.5" - } -} diff --git a/Chapter10/adding-a-queue-based-service/micro/webapp/app.js b/Chapter10/adding-a-queue-based-service/micro/webapp/app.js deleted file mode 100644 index eef315b..0000000 --- a/Chapter10/adding-a-queue-based-service/micro/webapp/app.js +++ /dev/null @@ -1,52 +0,0 @@ -var express = require('express') -var path = require('path') -var favicon = require('serve-favicon') -var logger = require('morgan') -var cookieParser = require('cookie-parser') -var bodyParser = require('body-parser') -var eventLogger = require('./lib/event-logger') - -var index = require('./routes/index') -var users = require('./routes/users') -var add = require('./routes/add') -var audit = require('./routes/audit') - -var app = express() - -// view engine setup -app.set('views', path.join(__dirname, 'views')) -app.set('view engine', 'ejs') - -// uncomment after placing your favicon in /public -// app.use(favicon(path.join(__dirname, 'public', 'favicon.ico'))); -app.use(eventLogger()) -app.use(logger('dev')) -app.use(bodyParser.json()) -app.use(bodyParser.urlencoded({ extended: false })) -app.use(cookieParser()) -app.use(express.static(path.join(__dirname, 'public'))) - -app.use('/', index) -app.use('/users', users) -app.use('/add', add) -app.use('/audit', audit) - -// catch 404 and forward to error handler -app.use(function (req, res, next) { - var err = new Error('Not Found') - err.status = 404 - next(err) -}) - -// error handler -app.use(function (err, req, res, next) { - // set locals, only providing error in development - res.locals.message = err.message - res.locals.error = req.app.get('env') === 'development' ? err : {} - - // render the error page - res.status(err.status || 500) - res.render('error') -}) - -module.exports = app diff --git a/Chapter10/adding-a-queue-based-service/micro/webapp/bin/www b/Chapter10/adding-a-queue-based-service/micro/webapp/bin/www deleted file mode 100644 index 8715eeb..0000000 --- a/Chapter10/adding-a-queue-based-service/micro/webapp/bin/www +++ /dev/null @@ -1,90 +0,0 @@ -#!/usr/bin/env node - -/** - * Module dependencies. - */ - -var app = require('../app'); -var debug = require('debug')('webapp:server'); -var http = require('http'); - -/** - * Get port from environment and store in Express. - */ - -var port = normalizePort(process.env.PORT || '3000'); -app.set('port', port); - -/** - * Create HTTP server. - */ - -var server = http.createServer(app); - -/** - * Listen on provided port, on all network interfaces. - */ - -server.listen(port); -server.on('error', onError); -server.on('listening', onListening); - -/** - * Normalize a port into a number, string, or false. - */ - -function normalizePort(val) { - var port = parseInt(val, 10); - - if (isNaN(port)) { - // named pipe - return val; - } - - if (port >= 0) { - // port number - return port; - } - - return false; -} - -/** - * Event listener for HTTP server "error" event. - */ - -function onError(error) { - if (error.syscall !== 'listen') { - throw error; - } - - var bind = typeof port === 'string' - ? 'Pipe ' + port - : 'Port ' + port; - - // handle specific listen errors with friendly messages - switch (error.code) { - case 'EACCES': - console.error(bind + ' requires elevated privileges'); - process.exit(1); - break; - case 'EADDRINUSE': - console.error(bind + ' is already in use'); - process.exit(1); - break; - default: - throw error; - } -} - -/** - * Event listener for HTTP server "listening" event. - */ - -function onListening() { - var addr = server.address(); - var bind = typeof addr === 'string' - ? 'pipe ' + addr - : 'port ' + addr.port; - debug('Listening on ' + bind); -} diff --git a/Chapter10/adding-a-queue-based-service/micro/webapp/lib/event-logger.js b/Chapter10/adding-a-queue-based-service/micro/webapp/lib/event-logger.js deleted file mode 100644 index 0140d3f..0000000 --- a/Chapter10/adding-a-queue-based-service/micro/webapp/lib/event-logger.js +++ /dev/null @@ -1,40 +0,0 @@ -'use strict' - -const { dns } = require('concordant')() -const redis = require('redis') - -module.exports = eventLogger - -function eventLogger () { - const QNAME = 'eventservice' - var client - - const endpoint = '_main._tcp.redis.micro.svc.cluster.local' - dns.resolve(endpoint, (err, locs) => { - if (err) { - console.error(err) - return - } - const { port, host } = locs[0] - client = redis.createClient(port, host) - }) - - function middleware (req, res, next) { - if (!client) { - console.log('client not ready, waiting 100ms') - setTimeout(middleware, 100, req, res, next) - return - } - const event = { - action: 'record', - type: 'page', - url: `${req.protocol}://${req.get('host')}${req.originalUrl}` - } - client.lpush(QNAME, JSON.stringify(event), (err) => { - if (err) console.error(err) - next() - }) - } - - return middleware -} diff --git a/Chapter10/adding-a-queue-based-service/micro/webapp/package.json b/Chapter10/adding-a-queue-based-service/micro/webapp/package.json deleted file mode 100644 index 1c45acf..0000000 --- a/Chapter10/adding-a-queue-based-service/micro/webapp/package.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "name": "webapp", - "version": "0.0.0", - "private": true, - "scripts": { - "start": "node ./bin/www" - }, - "dependencies": { - "body-parser": "~1.16.0", - "concordant": "^0.2.1", - "cookie-parser": "~1.4.3", - "debug": "~2.6.0", - "ejs": "~2.5.5", - "express": "~4.14.1", - "morgan": "~1.7.0", - "mu": "^2.1.2", - "restify": "^4.3.0", - "serve-favicon": "~2.3.2" - } -} diff --git a/Chapter10/adding-a-queue-based-service/micro/webapp/public/stylesheets/style.css b/Chapter10/adding-a-queue-based-service/micro/webapp/public/stylesheets/style.css deleted file mode 100644 index 9453385..0000000 --- a/Chapter10/adding-a-queue-based-service/micro/webapp/public/stylesheets/style.css +++ /dev/null @@ -1,8 +0,0 @@ -body { - padding: 50px; - font: 14px "Lucida Grande", Helvetica, Arial, sans-serif; -} - -a { - color: #00B7FF; -} diff --git a/Chapter10/adding-a-queue-based-service/micro/webapp/routes/add.js b/Chapter10/adding-a-queue-based-service/micro/webapp/routes/add.js deleted file mode 100644 index 3ab03cc..0000000 --- a/Chapter10/adding-a-queue-based-service/micro/webapp/routes/add.js +++ /dev/null @@ -1,68 +0,0 @@ -'use strict' - -const { Router } = require('express') -const restify = require('restify') -const { dns } = require('concordant')() -const router = Router() -var clients - -router.get('/', function (req, res) { - res.render('add', { first: 0, second: 0, result: 0 }) -}) - -router.post('/calculate', resolve, respond) - -function resolve (req, res, next) { - if (clients) { - next() - return - } - const adderservice = `_main._tcp.adderservice.micro.svc.cluster.local` - const auditservice = `_main._tcp.auditservice.micro.svc.cluster.local` - dns.resolve(adderservice, (err, locs) => { - if (err) { - next(err) - return - } - const { host, port } = locs[0] - const adder = `${host}:${port}` - dns.resolve(auditservice, (err, locs) => { - if (err) { - next(err) - return - } - const { host, port } = locs[0] - const audit = `${host}:${port}` - clients = { - adder: restify.createJSONClient({url: `http://${adder}`}), - audit: restify.createJSONClient({url: `http://${audit}`}) - } - next() - }) - }) -} - -function respond (req, res, next) { - const { first, second } = req.body - clients.adder.get( - `/add/${first}/${second}`, - (err, svcReq, svcRes, data) => { - if (err) { - next(err) - return - } - - const { result } = data - clients.audit.post('/append', { - calc: first + '+' + second, - calcResult: result - }, (err) => { - if (err) console.error(err) - }) - - res.render('add', { first, second, result }) - } - ) -} - -module.exports = router diff --git a/Chapter10/adding-a-queue-based-service/micro/webapp/routes/audit.js b/Chapter10/adding-a-queue-based-service/micro/webapp/routes/audit.js deleted file mode 100644 index a083eef..0000000 --- a/Chapter10/adding-a-queue-based-service/micro/webapp/routes/audit.js +++ /dev/null @@ -1,37 +0,0 @@ -'use strict' - -const { Router } = require('express') -const restify = require('restify') -const { dns } = require('concordant')() -const router = Router() -var client - -router.get('/', resolve, respond) - -function resolve (req, res, next) { - if (client) { - next() - return - } - const auditservice = `_main._tcp.auditservice.micro.svc.cluster.local` - dns.resolve(auditservice, (err, locs) => { - if (err) { - next(err) - return - } - const { host, port } = locs[0] - client = restify.createJSONClient(`http://${host}:${port}`) - }) -} - -function respond (req, res, next) { - client.get('/list', (err, svcReq, svcRes, data) => { - if (err) { - next(err) - return - } - res.render('audit', data) - }) -} - -module.exports = router diff --git a/Chapter10/adding-a-queue-based-service/micro/webapp/routes/index.js b/Chapter10/adding-a-queue-based-service/micro/webapp/routes/index.js deleted file mode 100644 index 956680b..0000000 --- a/Chapter10/adding-a-queue-based-service/micro/webapp/routes/index.js +++ /dev/null @@ -1,9 +0,0 @@ -var express = require('express') -var router = express.Router() - -/* GET home page. */ -router.get('/', function (req, res, next) { - res.render('index', { title: 'Express' }) -}) - -module.exports = router diff --git a/Chapter10/adding-a-queue-based-service/micro/webapp/routes/users.js b/Chapter10/adding-a-queue-based-service/micro/webapp/routes/users.js deleted file mode 100644 index 8cfe88f..0000000 --- a/Chapter10/adding-a-queue-based-service/micro/webapp/routes/users.js +++ /dev/null @@ -1,9 +0,0 @@ -var express = require('express') -var router = express.Router() - -/* GET users listing. */ -router.get('/', function (req, res, next) { - res.send('respond with a resource') -}) - -module.exports = router diff --git a/Chapter10/adding-a-queue-based-service/micro/webapp/views/add.ejs b/Chapter10/adding-a-queue-based-service/micro/webapp/views/add.ejs deleted file mode 100644 index da8279c..0000000 --- a/Chapter10/adding-a-queue-based-service/micro/webapp/views/add.ejs +++ /dev/null @@ -1,16 +0,0 @@ - - - - Add - - - -

Add it up!

-
- > - > -
- -

result = <%= result %>

- - diff --git a/Chapter10/adding-a-queue-based-service/micro/webapp/views/audit.ejs b/Chapter10/adding-a-queue-based-service/micro/webapp/views/audit.ejs deleted file mode 100644 index dd6d71b..0000000 --- a/Chapter10/adding-a-queue-based-service/micro/webapp/views/audit.ejs +++ /dev/null @@ -1,15 +0,0 @@ - - - - Audit - - - -

Calculation History

-
    - <% list.forEach(function (el) { %> -
  • at: <%= new Date(el.ts).toLocaleString() %>, calculated: <%= el.calc %>, result: <%= el.result %>
  • - <% }) %> -
- - \ No newline at end of file diff --git a/Chapter10/adding-a-queue-based-service/micro/webapp/views/error.ejs b/Chapter10/adding-a-queue-based-service/micro/webapp/views/error.ejs deleted file mode 100644 index 7cf94ed..0000000 --- a/Chapter10/adding-a-queue-based-service/micro/webapp/views/error.ejs +++ /dev/null @@ -1,3 +0,0 @@ -

<%= message %>

-

<%= error.status %>

-
<%= error.stack %>
diff --git a/Chapter10/adding-a-queue-based-service/micro/webapp/views/index.ejs b/Chapter10/adding-a-queue-based-service/micro/webapp/views/index.ejs deleted file mode 100644 index 7b7a1d6..0000000 --- a/Chapter10/adding-a-queue-based-service/micro/webapp/views/index.ejs +++ /dev/null @@ -1,11 +0,0 @@ - - - - <%= title %> - - - -

<%= title %>

-

Welcome to <%= title %>

- - diff --git a/Chapter10/consuming-a-service/micro/adderservice/package.json b/Chapter10/consuming-a-service/micro/adderservice/package.json deleted file mode 100644 index dedef88..0000000 --- a/Chapter10/consuming-a-service/micro/adderservice/package.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "name": "adderservice", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" - }, - "keywords": [], - "author": "Peter Elger", - "license": "ISC", - "dependencies": { - "restify": "^4.3.0" - } -} diff --git a/Chapter10/consuming-a-service/micro/adderservice/service.js b/Chapter10/consuming-a-service/micro/adderservice/service.js deleted file mode 100644 index a6d6e74..0000000 --- a/Chapter10/consuming-a-service/micro/adderservice/service.js +++ /dev/null @@ -1,18 +0,0 @@ -'use strict' - -const restify = require('restify') - -function respond (req, res, next) { - const result = (parseInt(req.params.first, 10) + - parseInt(req.params.second, 10)).toString() - res.send(result) - next() -} - -const server = restify.createServer() -server.get('/add/:first/:second', respond) - -server.listen(8080, () => { - console.log('%s listening at %s', server.name, server.url) -}) - diff --git a/Chapter10/consuming-a-service/micro/inttest/addtest.js b/Chapter10/consuming-a-service/micro/inttest/addtest.js deleted file mode 100644 index 10698e3..0000000 --- a/Chapter10/consuming-a-service/micro/inttest/addtest.js +++ /dev/null @@ -1,18 +0,0 @@ -'use strict' - -const request = require('superagent') -const { test } = require('tap') - -test('add test', (t) => { - t.plan(2) - - request - .post('http://localhost:3000/add/calculate') - .send('first=1') - .send('second=2') - .end((err, res) => { - t.equal(err, null) - t.ok(/result = 3/ig.test(res.text)) - }) -}) - diff --git a/Chapter10/consuming-a-service/micro/inttest/package.json b/Chapter10/consuming-a-service/micro/inttest/package.json deleted file mode 100644 index 672c6b2..0000000 --- a/Chapter10/consuming-a-service/micro/inttest/package.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "name": "inttest", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" - }, - "keywords": [], - "author": "Peter Elger", - "license": "ISC", - "devDependencies": { - "superagent": "^3.5.2", - "tap": "^10.3.1" - } -} diff --git a/Chapter10/consuming-a-service/micro/webapp/app.js b/Chapter10/consuming-a-service/micro/webapp/app.js deleted file mode 100644 index 90f0e7a..0000000 --- a/Chapter10/consuming-a-service/micro/webapp/app.js +++ /dev/null @@ -1,48 +0,0 @@ -var express = require('express') -var path = require('path') -var favicon = require('serve-favicon') -var logger = require('morgan') -var cookieParser = require('cookie-parser') -var bodyParser = require('body-parser') - -var index = require('./routes/index') -var users = require('./routes/users') -var add = require('./routes/add') - -var app = express() - -// view engine setup -app.set('views', path.join(__dirname, 'views')) -app.set('view engine', 'ejs') - -// uncomment after placing your favicon in /public -// app.use(favicon(path.join(__dirname, 'public', 'favicon.ico'))); -app.use(logger('dev')) -app.use(bodyParser.json()) -app.use(bodyParser.urlencoded({ extended: false })) -app.use(cookieParser()) -app.use(express.static(path.join(__dirname, 'public'))) - -app.use('/', index) -app.use('/users', users) -app.use('/add', add) - -// catch 404 and forward to error handler -app.use(function (req, res, next) { - var err = new Error('Not Found') - err.status = 404 - next(err) -}) - -// error handler -app.use(function (err, req, res, next) { - // set locals, only providing error in development - res.locals.message = err.message - res.locals.error = req.app.get('env') === 'development' ? err : {} - - // render the error page - res.status(err.status || 500) - res.render('error') -}) - -module.exports = app diff --git a/Chapter10/consuming-a-service/micro/webapp/bin/www b/Chapter10/consuming-a-service/micro/webapp/bin/www deleted file mode 100644 index 8715eeb..0000000 --- a/Chapter10/consuming-a-service/micro/webapp/bin/www +++ /dev/null @@ -1,90 +0,0 @@ -#!/usr/bin/env node - -/** - * Module dependencies. - */ - -var app = require('../app'); -var debug = require('debug')('webapp:server'); -var http = require('http'); - -/** - * Get port from environment and store in Express. - */ - -var port = normalizePort(process.env.PORT || '3000'); -app.set('port', port); - -/** - * Create HTTP server. - */ - -var server = http.createServer(app); - -/** - * Listen on provided port, on all network interfaces. - */ - -server.listen(port); -server.on('error', onError); -server.on('listening', onListening); - -/** - * Normalize a port into a number, string, or false. - */ - -function normalizePort(val) { - var port = parseInt(val, 10); - - if (isNaN(port)) { - // named pipe - return val; - } - - if (port >= 0) { - // port number - return port; - } - - return false; -} - -/** - * Event listener for HTTP server "error" event. - */ - -function onError(error) { - if (error.syscall !== 'listen') { - throw error; - } - - var bind = typeof port === 'string' - ? 'Pipe ' + port - : 'Port ' + port; - - // handle specific listen errors with friendly messages - switch (error.code) { - case 'EACCES': - console.error(bind + ' requires elevated privileges'); - process.exit(1); - break; - case 'EADDRINUSE': - console.error(bind + ' is already in use'); - process.exit(1); - break; - default: - throw error; - } -} - -/** - * Event listener for HTTP server "listening" event. - */ - -function onListening() { - var addr = server.address(); - var bind = typeof addr === 'string' - ? 'pipe ' + addr - : 'port ' + addr.port; - debug('Listening on ' + bind); -} diff --git a/Chapter10/consuming-a-service/micro/webapp/package.json b/Chapter10/consuming-a-service/micro/webapp/package.json deleted file mode 100644 index 1c0bcc8..0000000 --- a/Chapter10/consuming-a-service/micro/webapp/package.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "name": "webapp", - "version": "0.0.0", - "private": true, - "scripts": { - "start": "node ./bin/www" - }, - "dependencies": { - "body-parser": "~1.16.0", - "cookie-parser": "~1.4.3", - "debug": "~2.6.0", - "ejs": "~2.5.5", - "express": "~4.14.1", - "morgan": "~1.7.0", - "restify": "^4.3.0", - "serve-favicon": "~2.3.2" - } -} diff --git a/Chapter10/consuming-a-service/micro/webapp/public/stylesheets/style.css b/Chapter10/consuming-a-service/micro/webapp/public/stylesheets/style.css deleted file mode 100644 index 9453385..0000000 --- a/Chapter10/consuming-a-service/micro/webapp/public/stylesheets/style.css +++ /dev/null @@ -1,8 +0,0 @@ -body { - padding: 50px; - font: 14px "Lucida Grande", Helvetica, Arial, sans-serif; -} - -a { - color: #00B7FF; -} diff --git a/Chapter10/consuming-a-service/micro/webapp/routes/add.js b/Chapter10/consuming-a-service/micro/webapp/routes/add.js deleted file mode 100644 index 3240051..0000000 --- a/Chapter10/consuming-a-service/micro/webapp/routes/add.js +++ /dev/null @@ -1,26 +0,0 @@ -const { Router } = require('express') -const restify = require('restify') -const router = Router() - -router.get('/', function (req, res) { - res.render('add', { first: 0, second: 0, result: 0 }) -}) - -router.post('/calculate', function (req, res, next) { - const client = restify.createStringClient({ - url: 'http://localhost:8080' - }) - const {first, second} = req.body - client.get( - `/add/${first}/${second}`, - (err, svcReq, svcRes, result) => { - if (err) { - next(err) - return - } - res.render('add', { first, second, result }) - } - ) -}) - -module.exports = router diff --git a/Chapter10/consuming-a-service/micro/webapp/routes/index.js b/Chapter10/consuming-a-service/micro/webapp/routes/index.js deleted file mode 100644 index 956680b..0000000 --- a/Chapter10/consuming-a-service/micro/webapp/routes/index.js +++ /dev/null @@ -1,9 +0,0 @@ -var express = require('express') -var router = express.Router() - -/* GET home page. */ -router.get('/', function (req, res, next) { - res.render('index', { title: 'Express' }) -}) - -module.exports = router diff --git a/Chapter10/consuming-a-service/micro/webapp/routes/users.js b/Chapter10/consuming-a-service/micro/webapp/routes/users.js deleted file mode 100644 index 8cfe88f..0000000 --- a/Chapter10/consuming-a-service/micro/webapp/routes/users.js +++ /dev/null @@ -1,9 +0,0 @@ -var express = require('express') -var router = express.Router() - -/* GET users listing. */ -router.get('/', function (req, res, next) { - res.send('respond with a resource') -}) - -module.exports = router diff --git a/Chapter10/consuming-a-service/micro/webapp/views/add.ejs b/Chapter10/consuming-a-service/micro/webapp/views/add.ejs deleted file mode 100644 index da8279c..0000000 --- a/Chapter10/consuming-a-service/micro/webapp/views/add.ejs +++ /dev/null @@ -1,16 +0,0 @@ - - - - Add - - - -

Add it up!

-
- > - > -
- -

result = <%= result %>

- - diff --git a/Chapter10/consuming-a-service/micro/webapp/views/error.ejs b/Chapter10/consuming-a-service/micro/webapp/views/error.ejs deleted file mode 100644 index 7cf94ed..0000000 --- a/Chapter10/consuming-a-service/micro/webapp/views/error.ejs +++ /dev/null @@ -1,3 +0,0 @@ -

<%= message %>

-

<%= error.status %>

-
<%= error.stack %>
diff --git a/Chapter10/consuming-a-service/micro/webapp/views/index.ejs b/Chapter10/consuming-a-service/micro/webapp/views/index.ejs deleted file mode 100644 index 7b7a1d6..0000000 --- a/Chapter10/consuming-a-service/micro/webapp/views/index.ejs +++ /dev/null @@ -1,11 +0,0 @@ - - - - <%= title %> - - - -

<%= title %>

-

Welcome to <%= title %>

- - diff --git a/Chapter10/creating-a-simple-RESTful-microservice/micro-core-http/adderservice/package.json b/Chapter10/creating-a-simple-RESTful-microservice/micro-core-http/adderservice/package.json deleted file mode 100644 index dedef88..0000000 --- a/Chapter10/creating-a-simple-RESTful-microservice/micro-core-http/adderservice/package.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "name": "adderservice", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" - }, - "keywords": [], - "author": "Peter Elger", - "license": "ISC", - "dependencies": { - "restify": "^4.3.0" - } -} diff --git a/Chapter10/creating-a-simple-RESTful-microservice/micro-core-http/adderservice/service.js b/Chapter10/creating-a-simple-RESTful-microservice/micro-core-http/adderservice/service.js deleted file mode 100644 index b130c44..0000000 --- a/Chapter10/creating-a-simple-RESTful-microservice/micro-core-http/adderservice/service.js +++ /dev/null @@ -1,30 +0,0 @@ -'use strict' - -const http = require('http') - -const server = http.createServer(respond) - -server.listen(8080, function () { - console.log('listening on port 8080') -}) - -function respond (req, res) { - const [cmd, first, second] = req.url.split('/').slice(1) - const notFound = cmd !== 'add' || - first === undefined || - second === undefined - - if (notFound) { - error(404, res) - return - } - - const result = parseInt(first, 10) + parseInt(second, 10) - res.end(result) -} - -function error(code, res) { - res.statusCode = code - res.end(http.STATUS_CODES[code]) -} - diff --git a/Chapter10/creating-a-simple-RESTful-microservice/micro-core-http/curlexample.sh b/Chapter10/creating-a-simple-RESTful-microservice/micro-core-http/curlexample.sh deleted file mode 100644 index fb9583e..0000000 --- a/Chapter10/creating-a-simple-RESTful-microservice/micro-core-http/curlexample.sh +++ /dev/null @@ -1 +0,0 @@ -curl http://localhost:8080/add/1/2 diff --git a/Chapter10/creating-a-simple-RESTful-microservice/micro/adderservice/package.json b/Chapter10/creating-a-simple-RESTful-microservice/micro/adderservice/package.json deleted file mode 100644 index dedef88..0000000 --- a/Chapter10/creating-a-simple-RESTful-microservice/micro/adderservice/package.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "name": "adderservice", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" - }, - "keywords": [], - "author": "Peter Elger", - "license": "ISC", - "dependencies": { - "restify": "^4.3.0" - } -} diff --git a/Chapter10/creating-a-simple-RESTful-microservice/micro/adderservice/service.js b/Chapter10/creating-a-simple-RESTful-microservice/micro/adderservice/service.js deleted file mode 100644 index a6d6e74..0000000 --- a/Chapter10/creating-a-simple-RESTful-microservice/micro/adderservice/service.js +++ /dev/null @@ -1,18 +0,0 @@ -'use strict' - -const restify = require('restify') - -function respond (req, res, next) { - const result = (parseInt(req.params.first, 10) + - parseInt(req.params.second, 10)).toString() - res.send(result) - next() -} - -const server = restify.createServer() -server.get('/add/:first/:second', respond) - -server.listen(8080, () => { - console.log('%s listening at %s', server.name, server.url) -}) - diff --git a/Chapter10/creating-a-simple-RESTful-microservice/micro/curlexample.sh b/Chapter10/creating-a-simple-RESTful-microservice/micro/curlexample.sh deleted file mode 100644 index fb9583e..0000000 --- a/Chapter10/creating-a-simple-RESTful-microservice/micro/curlexample.sh +++ /dev/null @@ -1 +0,0 @@ -curl http://localhost:8080/add/1/2 diff --git a/Chapter10/service-discovery-with-dns/micro/adderservice/index.js b/Chapter10/service-discovery-with-dns/micro/adderservice/index.js deleted file mode 100644 index 1f2d9cf..0000000 --- a/Chapter10/service-discovery-with-dns/micro/adderservice/index.js +++ /dev/null @@ -1,7 +0,0 @@ -'use strict' - -const wiring = require('./wiring') -const service = require('./service')() - - -wiring(service) diff --git a/Chapter10/service-discovery-with-dns/micro/adderservice/package.json b/Chapter10/service-discovery-with-dns/micro/adderservice/package.json deleted file mode 100644 index 7cef23a..0000000 --- a/Chapter10/service-discovery-with-dns/micro/adderservice/package.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "name": "adderservice", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "test": "tap test" - }, - "keywords": [], - "author": "Peter Elger", - "license": "ISC", - "dependencies": { - "restify": "^4.3.0" - }, - "devDependencies": { - "tap": "^10.3.1" - } -} diff --git a/Chapter10/service-discovery-with-dns/micro/adderservice/service.js b/Chapter10/service-discovery-with-dns/micro/adderservice/service.js deleted file mode 100644 index 9d0d175..0000000 --- a/Chapter10/service-discovery-with-dns/micro/adderservice/service.js +++ /dev/null @@ -1,13 +0,0 @@ -'use strict' - -module.exports = service - -function service () { - function add (args, cb) { - const {first, second} = args - const result = (parseInt(first, 10) + parseInt(second, 10)) - cb(null, {result: result.toString()}) - } - - return { add } -} diff --git a/Chapter10/service-discovery-with-dns/micro/adderservice/test/index.js b/Chapter10/service-discovery-with-dns/micro/adderservice/test/index.js deleted file mode 100644 index 32c45e5..0000000 --- a/Chapter10/service-discovery-with-dns/micro/adderservice/test/index.js +++ /dev/null @@ -1,13 +0,0 @@ -'use strict' - -const {test} = require('tap') -const service = require('../service')() - -test('test add', (t) => { - t.plan(2) - - service.add({first: 1, second: 2}, (err, answer) => { - t.error(err) - t.same(answer, {result: 3}) - }) -}) diff --git a/Chapter10/service-discovery-with-dns/micro/adderservice/wiring.js b/Chapter10/service-discovery-with-dns/micro/adderservice/wiring.js deleted file mode 100644 index 0ed018c..0000000 --- a/Chapter10/service-discovery-with-dns/micro/adderservice/wiring.js +++ /dev/null @@ -1,27 +0,0 @@ -'use strict' - -const restify = require('restify') -const { ADDERSERVICE_SERVICE_PORT } = process.env - -module.exports = wiring - -function wiring (service) { - const server = restify.createServer() - - server.get('/add/:first/:second', (req, res, next) => { - service.add(req.params, (err, result) => { - if (err) { - res.send(err) - next() - return - } - res.send(200, result) - next() - }) - }) - - server.listen(ADDERSERVICE_SERVICE_PORT, '0.0.0.0', () => { - console.log('%s listening at %s', server.name, server.url) - }) -} - diff --git a/Chapter10/service-discovery-with-dns/micro/auditservice/index.js b/Chapter10/service-discovery-with-dns/micro/auditservice/index.js deleted file mode 100644 index 40a4677..0000000 --- a/Chapter10/service-discovery-with-dns/micro/auditservice/index.js +++ /dev/null @@ -1,6 +0,0 @@ -'use strict' - -const wiring = require('./wiring') -const service = require('./service')() - -wiring(service) diff --git a/Chapter10/service-discovery-with-dns/micro/auditservice/package.json b/Chapter10/service-discovery-with-dns/micro/auditservice/package.json deleted file mode 100644 index d93b31e..0000000 --- a/Chapter10/service-discovery-with-dns/micro/auditservice/package.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "name": "auditservice", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" - }, - "keywords": [], - "author": "Peter Elger", - "license": "ISC", - "dependencies": { - "concordant": "^0.2.1", - "mongo": "^0.1.0", - "restify": "^4.3.0" - } -} diff --git a/Chapter10/service-discovery-with-dns/micro/auditservice/service.js b/Chapter10/service-discovery-with-dns/micro/auditservice/service.js deleted file mode 100644 index c416e4c..0000000 --- a/Chapter10/service-discovery-with-dns/micro/auditservice/service.js +++ /dev/null @@ -1,74 +0,0 @@ -'use strict' - -const { MongoClient } = require('mongodb') -const { dns } = require('concordant')() - -module.exports = service - -function service () { - - var db - - setup() - - function setup () { - const mongo = '_main._tcp.mongo.micro.svc.cluster.local' - - dns.resolve(mongo, (err, locs) => { - if (err) { - console.error(err) - return - } - const { host, port } = locs[0] - const url = `mongodb://${host}:${port}/audit` - MongoClient.connect(url, (err, client) => { - if (err) { - console.log('failed to connect to MongoDB retrying in 100ms') - setTimeout(setup, 100) - return - } - db = client - db.on('close', () => db = null) - }) - }) - } - - function append (args, cb) { - if (!db) { - cb(Error('No database connection')) - return - } - const audit = db.collection('audit') - const data = { - ts: Date.now(), - calc: args.calc, - result: args.calcResult - } - - audit.insert(data, (err, result) => { - if (err) { - cb(err) - return - } - cb(null, {result: result.toString()}) - }) - } - - function list (args, cb) { - if (!db) { - cb(Error('No database connection')) - return - } - const audit = db.collection('audit') - audit.find({}, {limit: 10}).toArray((err, docs) => { - if (err) { - cb(err) - return - } - cb(null, {list: docs}) - }) - } - - return { append, list } -} - diff --git a/Chapter10/service-discovery-with-dns/micro/auditservice/wiring.js b/Chapter10/service-discovery-with-dns/micro/auditservice/wiring.js deleted file mode 100644 index b18dce8..0000000 --- a/Chapter10/service-discovery-with-dns/micro/auditservice/wiring.js +++ /dev/null @@ -1,39 +0,0 @@ -'use strict' - -const restify = require('restify') -const { AUDITSERVICE_SERVICE_PORT } = process.env - -module.exports = wiring - -function wiring (service) { - const server = restify.createServer() - - server.use(restify.bodyParser()) - - server.post('/append', (req, res, next) => { - service.append(req.params, (err, result) => { - if (err) { - res.send(err) - return - } - res.send(result) - next() - }) - }) - - server.get('/list', (req, res, next) => { - service.list(req.params, (err, result) => { - if (err) { - res.send(err) - return - } - res.send(200, result) - next() - }) - }) - - server.listen(AUDITSERVICE_SERVICE_PORT, '0.0.0.0', () => { - console.log('%s listening at %s', server.name, server.url) - }) -} - diff --git a/Chapter10/service-discovery-with-dns/micro/fuge/fuge.yml b/Chapter10/service-discovery-with-dns/micro/fuge/fuge.yml deleted file mode 100644 index c263ca7..0000000 --- a/Chapter10/service-discovery-with-dns/micro/fuge/fuge.yml +++ /dev/null @@ -1,35 +0,0 @@ -fuge_global: - dns_enabled: true - dns_host: 127.0.0.1 - dns_port: 53053 - dns_suffix: svc.cluster.local - dns_namespace: micro - tail: true - monitor: true - monitor_excludes: - - '**/node_modules/**' - - '**/.git/**' - - '*.log' -adderservice: - type: process - path: ../adderservice - run: node index.js - ports: - - main=8080 -webapp: - type: process - path: ../webapp - run: npm start - ports: - - main=3000 -auditservice: - type: process - path: ../auditservice - run: 'node index.js' - ports: - - main=8081 -mongo: - image: mongo - type: container - ports: - - main=27017:27017 diff --git a/Chapter10/service-discovery-with-dns/micro/webapp/app.js b/Chapter10/service-discovery-with-dns/micro/webapp/app.js deleted file mode 100644 index ec527f4..0000000 --- a/Chapter10/service-discovery-with-dns/micro/webapp/app.js +++ /dev/null @@ -1,50 +0,0 @@ -var express = require('express') -var path = require('path') -var favicon = require('serve-favicon') -var logger = require('morgan') -var cookieParser = require('cookie-parser') -var bodyParser = require('body-parser') - -var index = require('./routes/index') -var users = require('./routes/users') -var add = require('./routes/add') -var audit = require('./routes/audit') - -var app = express() - -// view engine setup -app.set('views', path.join(__dirname, 'views')) -app.set('view engine', 'ejs') - -// uncomment after placing your favicon in /public -// app.use(favicon(path.join(__dirname, 'public', 'favicon.ico'))); -app.use(logger('dev')) -app.use(bodyParser.json()) -app.use(bodyParser.urlencoded({ extended: false })) -app.use(cookieParser()) -app.use(express.static(path.join(__dirname, 'public'))) - -app.use('/', index) -app.use('/users', users) -app.use('/add', add) -app.use('/audit', audit) - -// catch 404 and forward to error handler -app.use(function (req, res, next) { - var err = new Error('Not Found') - err.status = 404 - next(err) -}) - -// error handler -app.use(function (err, req, res, next) { - // set locals, only providing error in development - res.locals.message = err.message - res.locals.error = req.app.get('env') === 'development' ? err : {} - - // render the error page - res.status(err.status || 500) - res.render('error') -}) - -module.exports = app diff --git a/Chapter10/service-discovery-with-dns/micro/webapp/bin/www b/Chapter10/service-discovery-with-dns/micro/webapp/bin/www deleted file mode 100644 index 8715eeb..0000000 --- a/Chapter10/service-discovery-with-dns/micro/webapp/bin/www +++ /dev/null @@ -1,90 +0,0 @@ -#!/usr/bin/env node - -/** - * Module dependencies. - */ - -var app = require('../app'); -var debug = require('debug')('webapp:server'); -var http = require('http'); - -/** - * Get port from environment and store in Express. - */ - -var port = normalizePort(process.env.PORT || '3000'); -app.set('port', port); - -/** - * Create HTTP server. - */ - -var server = http.createServer(app); - -/** - * Listen on provided port, on all network interfaces. - */ - -server.listen(port); -server.on('error', onError); -server.on('listening', onListening); - -/** - * Normalize a port into a number, string, or false. - */ - -function normalizePort(val) { - var port = parseInt(val, 10); - - if (isNaN(port)) { - // named pipe - return val; - } - - if (port >= 0) { - // port number - return port; - } - - return false; -} - -/** - * Event listener for HTTP server "error" event. - */ - -function onError(error) { - if (error.syscall !== 'listen') { - throw error; - } - - var bind = typeof port === 'string' - ? 'Pipe ' + port - : 'Port ' + port; - - // handle specific listen errors with friendly messages - switch (error.code) { - case 'EACCES': - console.error(bind + ' requires elevated privileges'); - process.exit(1); - break; - case 'EADDRINUSE': - console.error(bind + ' is already in use'); - process.exit(1); - break; - default: - throw error; - } -} - -/** - * Event listener for HTTP server "listening" event. - */ - -function onListening() { - var addr = server.address(); - var bind = typeof addr === 'string' - ? 'pipe ' + addr - : 'port ' + addr.port; - debug('Listening on ' + bind); -} diff --git a/Chapter10/service-discovery-with-dns/micro/webapp/package.json b/Chapter10/service-discovery-with-dns/micro/webapp/package.json deleted file mode 100644 index 1c45acf..0000000 --- a/Chapter10/service-discovery-with-dns/micro/webapp/package.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "name": "webapp", - "version": "0.0.0", - "private": true, - "scripts": { - "start": "node ./bin/www" - }, - "dependencies": { - "body-parser": "~1.16.0", - "concordant": "^0.2.1", - "cookie-parser": "~1.4.3", - "debug": "~2.6.0", - "ejs": "~2.5.5", - "express": "~4.14.1", - "morgan": "~1.7.0", - "mu": "^2.1.2", - "restify": "^4.3.0", - "serve-favicon": "~2.3.2" - } -} diff --git a/Chapter10/service-discovery-with-dns/micro/webapp/public/stylesheets/style.css b/Chapter10/service-discovery-with-dns/micro/webapp/public/stylesheets/style.css deleted file mode 100644 index 9453385..0000000 --- a/Chapter10/service-discovery-with-dns/micro/webapp/public/stylesheets/style.css +++ /dev/null @@ -1,8 +0,0 @@ -body { - padding: 50px; - font: 14px "Lucida Grande", Helvetica, Arial, sans-serif; -} - -a { - color: #00B7FF; -} diff --git a/Chapter10/service-discovery-with-dns/micro/webapp/routes/add.js b/Chapter10/service-discovery-with-dns/micro/webapp/routes/add.js deleted file mode 100644 index 3ab03cc..0000000 --- a/Chapter10/service-discovery-with-dns/micro/webapp/routes/add.js +++ /dev/null @@ -1,68 +0,0 @@ -'use strict' - -const { Router } = require('express') -const restify = require('restify') -const { dns } = require('concordant')() -const router = Router() -var clients - -router.get('/', function (req, res) { - res.render('add', { first: 0, second: 0, result: 0 }) -}) - -router.post('/calculate', resolve, respond) - -function resolve (req, res, next) { - if (clients) { - next() - return - } - const adderservice = `_main._tcp.adderservice.micro.svc.cluster.local` - const auditservice = `_main._tcp.auditservice.micro.svc.cluster.local` - dns.resolve(adderservice, (err, locs) => { - if (err) { - next(err) - return - } - const { host, port } = locs[0] - const adder = `${host}:${port}` - dns.resolve(auditservice, (err, locs) => { - if (err) { - next(err) - return - } - const { host, port } = locs[0] - const audit = `${host}:${port}` - clients = { - adder: restify.createJSONClient({url: `http://${adder}`}), - audit: restify.createJSONClient({url: `http://${audit}`}) - } - next() - }) - }) -} - -function respond (req, res, next) { - const { first, second } = req.body - clients.adder.get( - `/add/${first}/${second}`, - (err, svcReq, svcRes, data) => { - if (err) { - next(err) - return - } - - const { result } = data - clients.audit.post('/append', { - calc: first + '+' + second, - calcResult: result - }, (err) => { - if (err) console.error(err) - }) - - res.render('add', { first, second, result }) - } - ) -} - -module.exports = router diff --git a/Chapter10/service-discovery-with-dns/micro/webapp/routes/audit.js b/Chapter10/service-discovery-with-dns/micro/webapp/routes/audit.js deleted file mode 100644 index a083eef..0000000 --- a/Chapter10/service-discovery-with-dns/micro/webapp/routes/audit.js +++ /dev/null @@ -1,37 +0,0 @@ -'use strict' - -const { Router } = require('express') -const restify = require('restify') -const { dns } = require('concordant')() -const router = Router() -var client - -router.get('/', resolve, respond) - -function resolve (req, res, next) { - if (client) { - next() - return - } - const auditservice = `_main._tcp.auditservice.micro.svc.cluster.local` - dns.resolve(auditservice, (err, locs) => { - if (err) { - next(err) - return - } - const { host, port } = locs[0] - client = restify.createJSONClient(`http://${host}:${port}`) - }) -} - -function respond (req, res, next) { - client.get('/list', (err, svcReq, svcRes, data) => { - if (err) { - next(err) - return - } - res.render('audit', data) - }) -} - -module.exports = router diff --git a/Chapter10/service-discovery-with-dns/micro/webapp/routes/index.js b/Chapter10/service-discovery-with-dns/micro/webapp/routes/index.js deleted file mode 100644 index 956680b..0000000 --- a/Chapter10/service-discovery-with-dns/micro/webapp/routes/index.js +++ /dev/null @@ -1,9 +0,0 @@ -var express = require('express') -var router = express.Router() - -/* GET home page. */ -router.get('/', function (req, res, next) { - res.render('index', { title: 'Express' }) -}) - -module.exports = router diff --git a/Chapter10/service-discovery-with-dns/micro/webapp/routes/users.js b/Chapter10/service-discovery-with-dns/micro/webapp/routes/users.js deleted file mode 100644 index 8cfe88f..0000000 --- a/Chapter10/service-discovery-with-dns/micro/webapp/routes/users.js +++ /dev/null @@ -1,9 +0,0 @@ -var express = require('express') -var router = express.Router() - -/* GET users listing. */ -router.get('/', function (req, res, next) { - res.send('respond with a resource') -}) - -module.exports = router diff --git a/Chapter10/service-discovery-with-dns/micro/webapp/views/add.ejs b/Chapter10/service-discovery-with-dns/micro/webapp/views/add.ejs deleted file mode 100644 index da8279c..0000000 --- a/Chapter10/service-discovery-with-dns/micro/webapp/views/add.ejs +++ /dev/null @@ -1,16 +0,0 @@ - - - - Add - - - -

Add it up!

-
- > - > -
- -

result = <%= result %>

- - diff --git a/Chapter10/service-discovery-with-dns/micro/webapp/views/audit.ejs b/Chapter10/service-discovery-with-dns/micro/webapp/views/audit.ejs deleted file mode 100644 index dd6d71b..0000000 --- a/Chapter10/service-discovery-with-dns/micro/webapp/views/audit.ejs +++ /dev/null @@ -1,15 +0,0 @@ - - - - Audit - - - -

Calculation History

-
    - <% list.forEach(function (el) { %> -
  • at: <%= new Date(el.ts).toLocaleString() %>, calculated: <%= el.calc %>, result: <%= el.result %>
  • - <% }) %> -
- - \ No newline at end of file diff --git a/Chapter10/service-discovery-with-dns/micro/webapp/views/error.ejs b/Chapter10/service-discovery-with-dns/micro/webapp/views/error.ejs deleted file mode 100644 index 7cf94ed..0000000 --- a/Chapter10/service-discovery-with-dns/micro/webapp/views/error.ejs +++ /dev/null @@ -1,3 +0,0 @@ -

<%= message %>

-

<%= error.status %>

-
<%= error.stack %>
diff --git a/Chapter10/service-discovery-with-dns/micro/webapp/views/index.ejs b/Chapter10/service-discovery-with-dns/micro/webapp/views/index.ejs deleted file mode 100644 index 7b7a1d6..0000000 --- a/Chapter10/service-discovery-with-dns/micro/webapp/views/index.ejs +++ /dev/null @@ -1,11 +0,0 @@ - - - - <%= title %> - - - -

<%= title %>

-

Welcome to <%= title %>

- - diff --git a/Chapter10/setting-up-a-development-environment/micro-lil-pids/adderservice/package.json b/Chapter10/setting-up-a-development-environment/micro-lil-pids/adderservice/package.json deleted file mode 100644 index dedef88..0000000 --- a/Chapter10/setting-up-a-development-environment/micro-lil-pids/adderservice/package.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "name": "adderservice", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" - }, - "keywords": [], - "author": "Peter Elger", - "license": "ISC", - "dependencies": { - "restify": "^4.3.0" - } -} diff --git a/Chapter10/setting-up-a-development-environment/micro-lil-pids/adderservice/service.js b/Chapter10/setting-up-a-development-environment/micro-lil-pids/adderservice/service.js deleted file mode 100644 index 5131b53..0000000 --- a/Chapter10/setting-up-a-development-environment/micro-lil-pids/adderservice/service.js +++ /dev/null @@ -1,19 +0,0 @@ -'use strict' - -const restify = require('restify') - -function respond (req, res, next) { - const result = (parseInt(req.params.first, 10) + - parseInt(req.params.second, 10)).toString() - console.log('adding numbers!') - res.send(result) - next() -} - -const server = restify.createServer() -server.get('/add/:first/:second', respond) - -server.listen(8080, () => { - console.log('%s listening at %s', server.name, server.url) -}) - diff --git a/Chapter10/setting-up-a-development-environment/micro-lil-pids/services b/Chapter10/setting-up-a-development-environment/micro-lil-pids/services deleted file mode 100644 index 8d17b4a..0000000 --- a/Chapter10/setting-up-a-development-environment/micro-lil-pids/services +++ /dev/null @@ -1,2 +0,0 @@ -cd webapp && npm start -cd adderservice && node service diff --git a/Chapter10/setting-up-a-development-environment/micro-lil-pids/webapp/app.js b/Chapter10/setting-up-a-development-environment/micro-lil-pids/webapp/app.js deleted file mode 100644 index 90f0e7a..0000000 --- a/Chapter10/setting-up-a-development-environment/micro-lil-pids/webapp/app.js +++ /dev/null @@ -1,48 +0,0 @@ -var express = require('express') -var path = require('path') -var favicon = require('serve-favicon') -var logger = require('morgan') -var cookieParser = require('cookie-parser') -var bodyParser = require('body-parser') - -var index = require('./routes/index') -var users = require('./routes/users') -var add = require('./routes/add') - -var app = express() - -// view engine setup -app.set('views', path.join(__dirname, 'views')) -app.set('view engine', 'ejs') - -// uncomment after placing your favicon in /public -// app.use(favicon(path.join(__dirname, 'public', 'favicon.ico'))); -app.use(logger('dev')) -app.use(bodyParser.json()) -app.use(bodyParser.urlencoded({ extended: false })) -app.use(cookieParser()) -app.use(express.static(path.join(__dirname, 'public'))) - -app.use('/', index) -app.use('/users', users) -app.use('/add', add) - -// catch 404 and forward to error handler -app.use(function (req, res, next) { - var err = new Error('Not Found') - err.status = 404 - next(err) -}) - -// error handler -app.use(function (err, req, res, next) { - // set locals, only providing error in development - res.locals.message = err.message - res.locals.error = req.app.get('env') === 'development' ? err : {} - - // render the error page - res.status(err.status || 500) - res.render('error') -}) - -module.exports = app diff --git a/Chapter10/setting-up-a-development-environment/micro-lil-pids/webapp/bin/www b/Chapter10/setting-up-a-development-environment/micro-lil-pids/webapp/bin/www deleted file mode 100644 index 8715eeb..0000000 --- a/Chapter10/setting-up-a-development-environment/micro-lil-pids/webapp/bin/www +++ /dev/null @@ -1,90 +0,0 @@ -#!/usr/bin/env node - -/** - * Module dependencies. - */ - -var app = require('../app'); -var debug = require('debug')('webapp:server'); -var http = require('http'); - -/** - * Get port from environment and store in Express. - */ - -var port = normalizePort(process.env.PORT || '3000'); -app.set('port', port); - -/** - * Create HTTP server. - */ - -var server = http.createServer(app); - -/** - * Listen on provided port, on all network interfaces. - */ - -server.listen(port); -server.on('error', onError); -server.on('listening', onListening); - -/** - * Normalize a port into a number, string, or false. - */ - -function normalizePort(val) { - var port = parseInt(val, 10); - - if (isNaN(port)) { - // named pipe - return val; - } - - if (port >= 0) { - // port number - return port; - } - - return false; -} - -/** - * Event listener for HTTP server "error" event. - */ - -function onError(error) { - if (error.syscall !== 'listen') { - throw error; - } - - var bind = typeof port === 'string' - ? 'Pipe ' + port - : 'Port ' + port; - - // handle specific listen errors with friendly messages - switch (error.code) { - case 'EACCES': - console.error(bind + ' requires elevated privileges'); - process.exit(1); - break; - case 'EADDRINUSE': - console.error(bind + ' is already in use'); - process.exit(1); - break; - default: - throw error; - } -} - -/** - * Event listener for HTTP server "listening" event. - */ - -function onListening() { - var addr = server.address(); - var bind = typeof addr === 'string' - ? 'pipe ' + addr - : 'port ' + addr.port; - debug('Listening on ' + bind); -} diff --git a/Chapter10/setting-up-a-development-environment/micro-lil-pids/webapp/package.json b/Chapter10/setting-up-a-development-environment/micro-lil-pids/webapp/package.json deleted file mode 100644 index 1c0bcc8..0000000 --- a/Chapter10/setting-up-a-development-environment/micro-lil-pids/webapp/package.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "name": "webapp", - "version": "0.0.0", - "private": true, - "scripts": { - "start": "node ./bin/www" - }, - "dependencies": { - "body-parser": "~1.16.0", - "cookie-parser": "~1.4.3", - "debug": "~2.6.0", - "ejs": "~2.5.5", - "express": "~4.14.1", - "morgan": "~1.7.0", - "restify": "^4.3.0", - "serve-favicon": "~2.3.2" - } -} diff --git a/Chapter10/setting-up-a-development-environment/micro-lil-pids/webapp/public/stylesheets/style.css b/Chapter10/setting-up-a-development-environment/micro-lil-pids/webapp/public/stylesheets/style.css deleted file mode 100644 index 9453385..0000000 --- a/Chapter10/setting-up-a-development-environment/micro-lil-pids/webapp/public/stylesheets/style.css +++ /dev/null @@ -1,8 +0,0 @@ -body { - padding: 50px; - font: 14px "Lucida Grande", Helvetica, Arial, sans-serif; -} - -a { - color: #00B7FF; -} diff --git a/Chapter10/setting-up-a-development-environment/micro-lil-pids/webapp/routes/add.js b/Chapter10/setting-up-a-development-environment/micro-lil-pids/webapp/routes/add.js deleted file mode 100644 index e1c2ebc..0000000 --- a/Chapter10/setting-up-a-development-environment/micro-lil-pids/webapp/routes/add.js +++ /dev/null @@ -1,26 +0,0 @@ -const { Router } = require('express') -const restify = require('restify') -const router = Router() - -router.get('/', function (req, res) { - res.render('add', { first: 0, second: 0, result: 0 }) -}) - -router.post('/calculate', function (req, res, next) { - const client = restify.createStringClient({ - url: 'http://localhost:8080' - }) - const {first, second} = req.body - client.get( - `/add/${first}/${second}`, - (err, svcReq, svcRes, result) => { - if (err) { - next(err) - return - } - res.render('add', { first, second, result }) - } - ) -}) - -module.exports = router diff --git a/Chapter10/setting-up-a-development-environment/micro-lil-pids/webapp/routes/index.js b/Chapter10/setting-up-a-development-environment/micro-lil-pids/webapp/routes/index.js deleted file mode 100644 index 956680b..0000000 --- a/Chapter10/setting-up-a-development-environment/micro-lil-pids/webapp/routes/index.js +++ /dev/null @@ -1,9 +0,0 @@ -var express = require('express') -var router = express.Router() - -/* GET home page. */ -router.get('/', function (req, res, next) { - res.render('index', { title: 'Express' }) -}) - -module.exports = router diff --git a/Chapter10/setting-up-a-development-environment/micro-lil-pids/webapp/routes/users.js b/Chapter10/setting-up-a-development-environment/micro-lil-pids/webapp/routes/users.js deleted file mode 100644 index 8cfe88f..0000000 --- a/Chapter10/setting-up-a-development-environment/micro-lil-pids/webapp/routes/users.js +++ /dev/null @@ -1,9 +0,0 @@ -var express = require('express') -var router = express.Router() - -/* GET users listing. */ -router.get('/', function (req, res, next) { - res.send('respond with a resource') -}) - -module.exports = router diff --git a/Chapter10/setting-up-a-development-environment/micro-lil-pids/webapp/views/add.ejs b/Chapter10/setting-up-a-development-environment/micro-lil-pids/webapp/views/add.ejs deleted file mode 100644 index da8279c..0000000 --- a/Chapter10/setting-up-a-development-environment/micro-lil-pids/webapp/views/add.ejs +++ /dev/null @@ -1,16 +0,0 @@ - - - - Add - - - -

Add it up!

-
- > - > -
- -

result = <%= result %>

- - diff --git a/Chapter10/setting-up-a-development-environment/micro-lil-pids/webapp/views/error.ejs b/Chapter10/setting-up-a-development-environment/micro-lil-pids/webapp/views/error.ejs deleted file mode 100644 index 7cf94ed..0000000 --- a/Chapter10/setting-up-a-development-environment/micro-lil-pids/webapp/views/error.ejs +++ /dev/null @@ -1,3 +0,0 @@ -

<%= message %>

-

<%= error.status %>

-
<%= error.stack %>
diff --git a/Chapter10/setting-up-a-development-environment/micro-lil-pids/webapp/views/index.ejs b/Chapter10/setting-up-a-development-environment/micro-lil-pids/webapp/views/index.ejs deleted file mode 100644 index 7b7a1d6..0000000 --- a/Chapter10/setting-up-a-development-environment/micro-lil-pids/webapp/views/index.ejs +++ /dev/null @@ -1,11 +0,0 @@ - - - - <%= title %> - - - -

<%= title %>

-

Welcome to <%= title %>

- - diff --git a/Chapter10/setting-up-a-development-environment/micro/adderservice/package.json b/Chapter10/setting-up-a-development-environment/micro/adderservice/package.json deleted file mode 100644 index dedef88..0000000 --- a/Chapter10/setting-up-a-development-environment/micro/adderservice/package.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "name": "adderservice", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" - }, - "keywords": [], - "author": "Peter Elger", - "license": "ISC", - "dependencies": { - "restify": "^4.3.0" - } -} diff --git a/Chapter10/setting-up-a-development-environment/micro/adderservice/service.js b/Chapter10/setting-up-a-development-environment/micro/adderservice/service.js deleted file mode 100644 index 5131b53..0000000 --- a/Chapter10/setting-up-a-development-environment/micro/adderservice/service.js +++ /dev/null @@ -1,19 +0,0 @@ -'use strict' - -const restify = require('restify') - -function respond (req, res, next) { - const result = (parseInt(req.params.first, 10) + - parseInt(req.params.second, 10)).toString() - console.log('adding numbers!') - res.send(result) - next() -} - -const server = restify.createServer() -server.get('/add/:first/:second', respond) - -server.listen(8080, () => { - console.log('%s listening at %s', server.name, server.url) -}) - diff --git a/Chapter10/setting-up-a-development-environment/micro/fuge/fuge.yml b/Chapter10/setting-up-a-development-environment/micro/fuge/fuge.yml deleted file mode 100644 index 1868afd..0000000 --- a/Chapter10/setting-up-a-development-environment/micro/fuge/fuge.yml +++ /dev/null @@ -1,19 +0,0 @@ -fuge_global: - tail: true - monitor: true - monitor_excludes: - - '**/node_modules/**' - - '**/.git/**' - - '*.log' -adderservice: - type: process - path: ../adderservice - run: 'node service.js' - ports: - - main=8080 -webapp: - type: process - path: ../webapp - run: 'npm start' - ports: - - main=3000 diff --git a/Chapter10/setting-up-a-development-environment/micro/fuge/fuge2.yml b/Chapter10/setting-up-a-development-environment/micro/fuge/fuge2.yml deleted file mode 100644 index 642a1ba..0000000 --- a/Chapter10/setting-up-a-development-environment/micro/fuge/fuge2.yml +++ /dev/null @@ -1,19 +0,0 @@ -fuge_global: - tail: true - monitor: true - monitor_excludes: - - '**/node_modules/**' - - '**/.git/**' - - '*.log' -adderservice: - type: node - path: ../adderservice - run: 'node service.js' - ports: - - main=8080 -webapp: - type: process - path: ../webapp - run: 'npm start' - ports: - - main=3000 diff --git a/Chapter10/setting-up-a-development-environment/micro/webapp/app.js b/Chapter10/setting-up-a-development-environment/micro/webapp/app.js deleted file mode 100644 index 90f0e7a..0000000 --- a/Chapter10/setting-up-a-development-environment/micro/webapp/app.js +++ /dev/null @@ -1,48 +0,0 @@ -var express = require('express') -var path = require('path') -var favicon = require('serve-favicon') -var logger = require('morgan') -var cookieParser = require('cookie-parser') -var bodyParser = require('body-parser') - -var index = require('./routes/index') -var users = require('./routes/users') -var add = require('./routes/add') - -var app = express() - -// view engine setup -app.set('views', path.join(__dirname, 'views')) -app.set('view engine', 'ejs') - -// uncomment after placing your favicon in /public -// app.use(favicon(path.join(__dirname, 'public', 'favicon.ico'))); -app.use(logger('dev')) -app.use(bodyParser.json()) -app.use(bodyParser.urlencoded({ extended: false })) -app.use(cookieParser()) -app.use(express.static(path.join(__dirname, 'public'))) - -app.use('/', index) -app.use('/users', users) -app.use('/add', add) - -// catch 404 and forward to error handler -app.use(function (req, res, next) { - var err = new Error('Not Found') - err.status = 404 - next(err) -}) - -// error handler -app.use(function (err, req, res, next) { - // set locals, only providing error in development - res.locals.message = err.message - res.locals.error = req.app.get('env') === 'development' ? err : {} - - // render the error page - res.status(err.status || 500) - res.render('error') -}) - -module.exports = app diff --git a/Chapter10/setting-up-a-development-environment/micro/webapp/bin/www b/Chapter10/setting-up-a-development-environment/micro/webapp/bin/www deleted file mode 100644 index 8715eeb..0000000 --- a/Chapter10/setting-up-a-development-environment/micro/webapp/bin/www +++ /dev/null @@ -1,90 +0,0 @@ -#!/usr/bin/env node - -/** - * Module dependencies. - */ - -var app = require('../app'); -var debug = require('debug')('webapp:server'); -var http = require('http'); - -/** - * Get port from environment and store in Express. - */ - -var port = normalizePort(process.env.PORT || '3000'); -app.set('port', port); - -/** - * Create HTTP server. - */ - -var server = http.createServer(app); - -/** - * Listen on provided port, on all network interfaces. - */ - -server.listen(port); -server.on('error', onError); -server.on('listening', onListening); - -/** - * Normalize a port into a number, string, or false. - */ - -function normalizePort(val) { - var port = parseInt(val, 10); - - if (isNaN(port)) { - // named pipe - return val; - } - - if (port >= 0) { - // port number - return port; - } - - return false; -} - -/** - * Event listener for HTTP server "error" event. - */ - -function onError(error) { - if (error.syscall !== 'listen') { - throw error; - } - - var bind = typeof port === 'string' - ? 'Pipe ' + port - : 'Port ' + port; - - // handle specific listen errors with friendly messages - switch (error.code) { - case 'EACCES': - console.error(bind + ' requires elevated privileges'); - process.exit(1); - break; - case 'EADDRINUSE': - console.error(bind + ' is already in use'); - process.exit(1); - break; - default: - throw error; - } -} - -/** - * Event listener for HTTP server "listening" event. - */ - -function onListening() { - var addr = server.address(); - var bind = typeof addr === 'string' - ? 'pipe ' + addr - : 'port ' + addr.port; - debug('Listening on ' + bind); -} diff --git a/Chapter10/setting-up-a-development-environment/micro/webapp/package.json b/Chapter10/setting-up-a-development-environment/micro/webapp/package.json deleted file mode 100644 index 1c0bcc8..0000000 --- a/Chapter10/setting-up-a-development-environment/micro/webapp/package.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "name": "webapp", - "version": "0.0.0", - "private": true, - "scripts": { - "start": "node ./bin/www" - }, - "dependencies": { - "body-parser": "~1.16.0", - "cookie-parser": "~1.4.3", - "debug": "~2.6.0", - "ejs": "~2.5.5", - "express": "~4.14.1", - "morgan": "~1.7.0", - "restify": "^4.3.0", - "serve-favicon": "~2.3.2" - } -} diff --git a/Chapter10/setting-up-a-development-environment/micro/webapp/public/stylesheets/style.css b/Chapter10/setting-up-a-development-environment/micro/webapp/public/stylesheets/style.css deleted file mode 100644 index 9453385..0000000 --- a/Chapter10/setting-up-a-development-environment/micro/webapp/public/stylesheets/style.css +++ /dev/null @@ -1,8 +0,0 @@ -body { - padding: 50px; - font: 14px "Lucida Grande", Helvetica, Arial, sans-serif; -} - -a { - color: #00B7FF; -} diff --git a/Chapter10/setting-up-a-development-environment/micro/webapp/routes/add.js b/Chapter10/setting-up-a-development-environment/micro/webapp/routes/add.js deleted file mode 100644 index e1c2ebc..0000000 --- a/Chapter10/setting-up-a-development-environment/micro/webapp/routes/add.js +++ /dev/null @@ -1,26 +0,0 @@ -const { Router } = require('express') -const restify = require('restify') -const router = Router() - -router.get('/', function (req, res) { - res.render('add', { first: 0, second: 0, result: 0 }) -}) - -router.post('/calculate', function (req, res, next) { - const client = restify.createStringClient({ - url: 'http://localhost:8080' - }) - const {first, second} = req.body - client.get( - `/add/${first}/${second}`, - (err, svcReq, svcRes, result) => { - if (err) { - next(err) - return - } - res.render('add', { first, second, result }) - } - ) -}) - -module.exports = router diff --git a/Chapter10/setting-up-a-development-environment/micro/webapp/routes/index.js b/Chapter10/setting-up-a-development-environment/micro/webapp/routes/index.js deleted file mode 100644 index 956680b..0000000 --- a/Chapter10/setting-up-a-development-environment/micro/webapp/routes/index.js +++ /dev/null @@ -1,9 +0,0 @@ -var express = require('express') -var router = express.Router() - -/* GET home page. */ -router.get('/', function (req, res, next) { - res.render('index', { title: 'Express' }) -}) - -module.exports = router diff --git a/Chapter10/setting-up-a-development-environment/micro/webapp/routes/users.js b/Chapter10/setting-up-a-development-environment/micro/webapp/routes/users.js deleted file mode 100644 index 8cfe88f..0000000 --- a/Chapter10/setting-up-a-development-environment/micro/webapp/routes/users.js +++ /dev/null @@ -1,9 +0,0 @@ -var express = require('express') -var router = express.Router() - -/* GET users listing. */ -router.get('/', function (req, res, next) { - res.send('respond with a resource') -}) - -module.exports = router diff --git a/Chapter10/setting-up-a-development-environment/micro/webapp/views/add.ejs b/Chapter10/setting-up-a-development-environment/micro/webapp/views/add.ejs deleted file mode 100644 index da8279c..0000000 --- a/Chapter10/setting-up-a-development-environment/micro/webapp/views/add.ejs +++ /dev/null @@ -1,16 +0,0 @@ - - - - Add - - - -

Add it up!

-
- > - > -
- -

result = <%= result %>

- - diff --git a/Chapter10/setting-up-a-development-environment/micro/webapp/views/error.ejs b/Chapter10/setting-up-a-development-environment/micro/webapp/views/error.ejs deleted file mode 100644 index 7cf94ed..0000000 --- a/Chapter10/setting-up-a-development-environment/micro/webapp/views/error.ejs +++ /dev/null @@ -1,3 +0,0 @@ -

<%= message %>

-

<%= error.status %>

-
<%= error.stack %>
diff --git a/Chapter10/setting-up-a-development-environment/micro/webapp/views/index.ejs b/Chapter10/setting-up-a-development-environment/micro/webapp/views/index.ejs deleted file mode 100644 index 7b7a1d6..0000000 --- a/Chapter10/setting-up-a-development-environment/micro/webapp/views/index.ejs +++ /dev/null @@ -1,11 +0,0 @@ - - - - <%= title %> - - - -

<%= title %>

-

Welcome to <%= title %>

- - diff --git a/Chapter10/standardizing-service-boilerplate/micro-pattern-routing/adderservice/index.js b/Chapter10/standardizing-service-boilerplate/micro-pattern-routing/adderservice/index.js deleted file mode 100644 index 1f2d9cf..0000000 --- a/Chapter10/standardizing-service-boilerplate/micro-pattern-routing/adderservice/index.js +++ /dev/null @@ -1,7 +0,0 @@ -'use strict' - -const wiring = require('./wiring') -const service = require('./service')() - - -wiring(service) diff --git a/Chapter10/standardizing-service-boilerplate/micro-pattern-routing/adderservice/package.json b/Chapter10/standardizing-service-boilerplate/micro-pattern-routing/adderservice/package.json deleted file mode 100644 index e2d4f59..0000000 --- a/Chapter10/standardizing-service-boilerplate/micro-pattern-routing/adderservice/package.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "name": "adderservice", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" - }, - "keywords": [], - "author": "Peter Elger", - "license": "ISC", - "dependencies": { - "bloomrun": "^3.0.4", - "net-object-stream": "^2.0.0", - "pump": "^1.0.2", - "through2": "^2.0.3" - }, - "devDependencies": { - "tap": "^10.3.1" - } -} diff --git a/Chapter10/standardizing-service-boilerplate/micro-pattern-routing/adderservice/service.js b/Chapter10/standardizing-service-boilerplate/micro-pattern-routing/adderservice/service.js deleted file mode 100644 index 9d0d175..0000000 --- a/Chapter10/standardizing-service-boilerplate/micro-pattern-routing/adderservice/service.js +++ /dev/null @@ -1,13 +0,0 @@ -'use strict' - -module.exports = service - -function service () { - function add (args, cb) { - const {first, second} = args - const result = (parseInt(first, 10) + parseInt(second, 10)) - cb(null, {result: result.toString()}) - } - - return { add } -} diff --git a/Chapter10/standardizing-service-boilerplate/micro-pattern-routing/adderservice/test/test.js b/Chapter10/standardizing-service-boilerplate/micro-pattern-routing/adderservice/test/test.js deleted file mode 100644 index 3b775c3..0000000 --- a/Chapter10/standardizing-service-boilerplate/micro-pattern-routing/adderservice/test/test.js +++ /dev/null @@ -1,12 +0,0 @@ -var test = require('tap').test -var service = require('../service')() - -test('test add', function (t) { - t.plan(2) - - service.add({first: 1, second: 2}, function (err, result) { - t.equal(err, null) - t.equal(result, 3) - }) -}) - diff --git a/Chapter10/standardizing-service-boilerplate/micro-pattern-routing/adderservice/wiring.js b/Chapter10/standardizing-service-boilerplate/micro-pattern-routing/adderservice/wiring.js deleted file mode 100644 index 6411252..0000000 --- a/Chapter10/standardizing-service-boilerplate/micro-pattern-routing/adderservice/wiring.js +++ /dev/null @@ -1,55 +0,0 @@ -'use strict' - -const net = require('net') -const nos = require('net-object-stream') -const through = require('through2') -const pump = require('pump') -const bloomrun = require('bloomrun') - -const { ADDERSERVICE_SERVICE_PORT } = process.env - -module.exports = wiring - -function wiring (service) { - const patterns = createPatternRoutes(service) - const matcher = createMatcherStream(patterns) - - const server = net.createServer((socket) => { - socket = nos(socket) - pump(socket, matcher, socket, failure) - }) - - server.listen(ADDERSERVICE_SERVICE_PORT, '0.0.0.0', () => { - console.log('server listening at', ADDERSERVICE_SERVICE_PORT) - }) -} - -function createPatternRoutes (service) { - const patterns = bloomrun() - - patterns.add({role: 'adder', cmd: 'add'}, service.add) - - return patterns -} - -function createMatcherStream (patterns) { - return through.obj((object, enc, cb) => { - const match = patterns.lookup(object) - if (match === null) { - cb() - return - } - match(object, (err, data) => { - if (err) { - cb(null, {status: 'error', err: err}) - return - } - cb(null, data) - }) - }) -} - -function failure (err) { - if (err) console.error('Server error', err) - else console.error('Stream pipeline ended') -} \ No newline at end of file diff --git a/Chapter10/standardizing-service-boilerplate/micro-pattern-routing/fuge/fuge.yml b/Chapter10/standardizing-service-boilerplate/micro-pattern-routing/fuge/fuge.yml deleted file mode 100644 index 94093bd..0000000 --- a/Chapter10/standardizing-service-boilerplate/micro-pattern-routing/fuge/fuge.yml +++ /dev/null @@ -1,19 +0,0 @@ -fuge_global: - tail: true - monitor: true - monitor_excludes: - - '**/node_modules/**' - - '**/.git/**' - - '*.log' -adderservice: - type: process - path: ../adderservice - run: node index.js - ports: - - main=8080 -webapp: - type: process - path: ../webapp - run: npm start - ports: - - main=3000 diff --git a/Chapter10/standardizing-service-boilerplate/micro-pattern-routing/webapp/app.js b/Chapter10/standardizing-service-boilerplate/micro-pattern-routing/webapp/app.js deleted file mode 100644 index 90f0e7a..0000000 --- a/Chapter10/standardizing-service-boilerplate/micro-pattern-routing/webapp/app.js +++ /dev/null @@ -1,48 +0,0 @@ -var express = require('express') -var path = require('path') -var favicon = require('serve-favicon') -var logger = require('morgan') -var cookieParser = require('cookie-parser') -var bodyParser = require('body-parser') - -var index = require('./routes/index') -var users = require('./routes/users') -var add = require('./routes/add') - -var app = express() - -// view engine setup -app.set('views', path.join(__dirname, 'views')) -app.set('view engine', 'ejs') - -// uncomment after placing your favicon in /public -// app.use(favicon(path.join(__dirname, 'public', 'favicon.ico'))); -app.use(logger('dev')) -app.use(bodyParser.json()) -app.use(bodyParser.urlencoded({ extended: false })) -app.use(cookieParser()) -app.use(express.static(path.join(__dirname, 'public'))) - -app.use('/', index) -app.use('/users', users) -app.use('/add', add) - -// catch 404 and forward to error handler -app.use(function (req, res, next) { - var err = new Error('Not Found') - err.status = 404 - next(err) -}) - -// error handler -app.use(function (err, req, res, next) { - // set locals, only providing error in development - res.locals.message = err.message - res.locals.error = req.app.get('env') === 'development' ? err : {} - - // render the error page - res.status(err.status || 500) - res.render('error') -}) - -module.exports = app diff --git a/Chapter10/standardizing-service-boilerplate/micro-pattern-routing/webapp/bin/www b/Chapter10/standardizing-service-boilerplate/micro-pattern-routing/webapp/bin/www deleted file mode 100644 index 8715eeb..0000000 --- a/Chapter10/standardizing-service-boilerplate/micro-pattern-routing/webapp/bin/www +++ /dev/null @@ -1,90 +0,0 @@ -#!/usr/bin/env node - -/** - * Module dependencies. - */ - -var app = require('../app'); -var debug = require('debug')('webapp:server'); -var http = require('http'); - -/** - * Get port from environment and store in Express. - */ - -var port = normalizePort(process.env.PORT || '3000'); -app.set('port', port); - -/** - * Create HTTP server. - */ - -var server = http.createServer(app); - -/** - * Listen on provided port, on all network interfaces. - */ - -server.listen(port); -server.on('error', onError); -server.on('listening', onListening); - -/** - * Normalize a port into a number, string, or false. - */ - -function normalizePort(val) { - var port = parseInt(val, 10); - - if (isNaN(port)) { - // named pipe - return val; - } - - if (port >= 0) { - // port number - return port; - } - - return false; -} - -/** - * Event listener for HTTP server "error" event. - */ - -function onError(error) { - if (error.syscall !== 'listen') { - throw error; - } - - var bind = typeof port === 'string' - ? 'Pipe ' + port - : 'Port ' + port; - - // handle specific listen errors with friendly messages - switch (error.code) { - case 'EACCES': - console.error(bind + ' requires elevated privileges'); - process.exit(1); - break; - case 'EADDRINUSE': - console.error(bind + ' is already in use'); - process.exit(1); - break; - default: - throw error; - } -} - -/** - * Event listener for HTTP server "listening" event. - */ - -function onListening() { - var addr = server.address(); - var bind = typeof addr === 'string' - ? 'pipe ' + addr - : 'port ' + addr.port; - debug('Listening on ' + bind); -} diff --git a/Chapter10/standardizing-service-boilerplate/micro-pattern-routing/webapp/package.json b/Chapter10/standardizing-service-boilerplate/micro-pattern-routing/webapp/package.json deleted file mode 100644 index ce66c6a..0000000 --- a/Chapter10/standardizing-service-boilerplate/micro-pattern-routing/webapp/package.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "name": "webapp", - "version": "0.0.0", - "private": true, - "scripts": { - "start": "node ./bin/www" - }, - "dependencies": { - "body-parser": "~1.16.0", - "cookie-parser": "~1.4.3", - "debug": "~2.6.0", - "ejs": "~2.5.5", - "express": "~4.14.1", - "morgan": "~1.7.0", - "mu": "^2.1.2", - "net-object-stream": "^2.0.0", - "restify": "^4.3.0", - "serve-favicon": "~2.3.2" - } -} diff --git a/Chapter10/standardizing-service-boilerplate/micro-pattern-routing/webapp/public/stylesheets/style.css b/Chapter10/standardizing-service-boilerplate/micro-pattern-routing/webapp/public/stylesheets/style.css deleted file mode 100644 index 9453385..0000000 --- a/Chapter10/standardizing-service-boilerplate/micro-pattern-routing/webapp/public/stylesheets/style.css +++ /dev/null @@ -1,8 +0,0 @@ -body { - padding: 50px; - font: 14px "Lucida Grande", Helvetica, Arial, sans-serif; -} - -a { - color: #00B7FF; -} diff --git a/Chapter10/standardizing-service-boilerplate/micro-pattern-routing/webapp/routes/add.js b/Chapter10/standardizing-service-boilerplate/micro-pattern-routing/webapp/routes/add.js deleted file mode 100644 index d96af85..0000000 --- a/Chapter10/standardizing-service-boilerplate/micro-pattern-routing/webapp/routes/add.js +++ /dev/null @@ -1,38 +0,0 @@ -'use strict' - -const { Router } = require('express') -const restify = require('restify') -const net = require('net') -const nos = require('net-object-stream') -const router = Router() - -const { - ADDERSERVICE_SERVICE_HOST, - ADDERSERVICE_SERVICE_PORT -} = process.env - -function createClient (ns, opts) { - return createClient[ns] || (createClient[ns] = nos(net.connect(opts))) -} - -router.get('/', function (req, res) { - res.render('add', { first: 0, second: 0, result: 0 }) -}) - -router.post('/calculate', function (req, res, next) { - const client = createClient('calculate', { - host: ADDERSERVICE_SERVICE_HOST, - port: ADDERSERVICE_SERVICE_PORT - }) - - const role = 'adder' - const cmd = 'add' - const { first, second } = req.body - client.once('data', (data) => { - const { result } = data - res.render('add', { first, second, result }) - }) - client.write({role, cmd, first, second}) -}) - -module.exports = router diff --git a/Chapter10/standardizing-service-boilerplate/micro-pattern-routing/webapp/routes/index.js b/Chapter10/standardizing-service-boilerplate/micro-pattern-routing/webapp/routes/index.js deleted file mode 100644 index 956680b..0000000 --- a/Chapter10/standardizing-service-boilerplate/micro-pattern-routing/webapp/routes/index.js +++ /dev/null @@ -1,9 +0,0 @@ -var express = require('express') -var router = express.Router() - -/* GET home page. */ -router.get('/', function (req, res, next) { - res.render('index', { title: 'Express' }) -}) - -module.exports = router diff --git a/Chapter10/standardizing-service-boilerplate/micro-pattern-routing/webapp/routes/users.js b/Chapter10/standardizing-service-boilerplate/micro-pattern-routing/webapp/routes/users.js deleted file mode 100644 index 8cfe88f..0000000 --- a/Chapter10/standardizing-service-boilerplate/micro-pattern-routing/webapp/routes/users.js +++ /dev/null @@ -1,9 +0,0 @@ -var express = require('express') -var router = express.Router() - -/* GET users listing. */ -router.get('/', function (req, res, next) { - res.send('respond with a resource') -}) - -module.exports = router diff --git a/Chapter10/standardizing-service-boilerplate/micro-pattern-routing/webapp/views/add.ejs b/Chapter10/standardizing-service-boilerplate/micro-pattern-routing/webapp/views/add.ejs deleted file mode 100644 index da8279c..0000000 --- a/Chapter10/standardizing-service-boilerplate/micro-pattern-routing/webapp/views/add.ejs +++ /dev/null @@ -1,16 +0,0 @@ - - - - Add - - - -

Add it up!

-
- > - > -
- -

result = <%= result %>

- - diff --git a/Chapter10/standardizing-service-boilerplate/micro-pattern-routing/webapp/views/error.ejs b/Chapter10/standardizing-service-boilerplate/micro-pattern-routing/webapp/views/error.ejs deleted file mode 100644 index 7cf94ed..0000000 --- a/Chapter10/standardizing-service-boilerplate/micro-pattern-routing/webapp/views/error.ejs +++ /dev/null @@ -1,3 +0,0 @@ -

<%= message %>

-

<%= error.status %>

-
<%= error.stack %>
diff --git a/Chapter10/standardizing-service-boilerplate/micro-pattern-routing/webapp/views/index.ejs b/Chapter10/standardizing-service-boilerplate/micro-pattern-routing/webapp/views/index.ejs deleted file mode 100644 index 7b7a1d6..0000000 --- a/Chapter10/standardizing-service-boilerplate/micro-pattern-routing/webapp/views/index.ejs +++ /dev/null @@ -1,11 +0,0 @@ - - - - <%= title %> - - - -

<%= title %>

-

Welcome to <%= title %>

- - diff --git a/Chapter10/standardizing-service-boilerplate/micro/adderservice/index.js b/Chapter10/standardizing-service-boilerplate/micro/adderservice/index.js deleted file mode 100644 index 1f2d9cf..0000000 --- a/Chapter10/standardizing-service-boilerplate/micro/adderservice/index.js +++ /dev/null @@ -1,7 +0,0 @@ -'use strict' - -const wiring = require('./wiring') -const service = require('./service')() - - -wiring(service) diff --git a/Chapter10/standardizing-service-boilerplate/micro/adderservice/package.json b/Chapter10/standardizing-service-boilerplate/micro/adderservice/package.json deleted file mode 100644 index 7cef23a..0000000 --- a/Chapter10/standardizing-service-boilerplate/micro/adderservice/package.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "name": "adderservice", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "test": "tap test" - }, - "keywords": [], - "author": "Peter Elger", - "license": "ISC", - "dependencies": { - "restify": "^4.3.0" - }, - "devDependencies": { - "tap": "^10.3.1" - } -} diff --git a/Chapter10/standardizing-service-boilerplate/micro/adderservice/service.js b/Chapter10/standardizing-service-boilerplate/micro/adderservice/service.js deleted file mode 100644 index 9d0d175..0000000 --- a/Chapter10/standardizing-service-boilerplate/micro/adderservice/service.js +++ /dev/null @@ -1,13 +0,0 @@ -'use strict' - -module.exports = service - -function service () { - function add (args, cb) { - const {first, second} = args - const result = (parseInt(first, 10) + parseInt(second, 10)) - cb(null, {result: result.toString()}) - } - - return { add } -} diff --git a/Chapter10/standardizing-service-boilerplate/micro/adderservice/test/index.js b/Chapter10/standardizing-service-boilerplate/micro/adderservice/test/index.js deleted file mode 100644 index 32c45e5..0000000 --- a/Chapter10/standardizing-service-boilerplate/micro/adderservice/test/index.js +++ /dev/null @@ -1,13 +0,0 @@ -'use strict' - -const {test} = require('tap') -const service = require('../service')() - -test('test add', (t) => { - t.plan(2) - - service.add({first: 1, second: 2}, (err, answer) => { - t.error(err) - t.same(answer, {result: 3}) - }) -}) diff --git a/Chapter10/standardizing-service-boilerplate/micro/adderservice/wiring.js b/Chapter10/standardizing-service-boilerplate/micro/adderservice/wiring.js deleted file mode 100644 index 0ed018c..0000000 --- a/Chapter10/standardizing-service-boilerplate/micro/adderservice/wiring.js +++ /dev/null @@ -1,27 +0,0 @@ -'use strict' - -const restify = require('restify') -const { ADDERSERVICE_SERVICE_PORT } = process.env - -module.exports = wiring - -function wiring (service) { - const server = restify.createServer() - - server.get('/add/:first/:second', (req, res, next) => { - service.add(req.params, (err, result) => { - if (err) { - res.send(err) - next() - return - } - res.send(200, result) - next() - }) - }) - - server.listen(ADDERSERVICE_SERVICE_PORT, '0.0.0.0', () => { - console.log('%s listening at %s', server.name, server.url) - }) -} - diff --git a/Chapter10/standardizing-service-boilerplate/micro/fuge/fuge.yml b/Chapter10/standardizing-service-boilerplate/micro/fuge/fuge.yml deleted file mode 100644 index 94093bd..0000000 --- a/Chapter10/standardizing-service-boilerplate/micro/fuge/fuge.yml +++ /dev/null @@ -1,19 +0,0 @@ -fuge_global: - tail: true - monitor: true - monitor_excludes: - - '**/node_modules/**' - - '**/.git/**' - - '*.log' -adderservice: - type: process - path: ../adderservice - run: node index.js - ports: - - main=8080 -webapp: - type: process - path: ../webapp - run: npm start - ports: - - main=3000 diff --git a/Chapter10/standardizing-service-boilerplate/micro/webapp/app.js b/Chapter10/standardizing-service-boilerplate/micro/webapp/app.js deleted file mode 100644 index 90f0e7a..0000000 --- a/Chapter10/standardizing-service-boilerplate/micro/webapp/app.js +++ /dev/null @@ -1,48 +0,0 @@ -var express = require('express') -var path = require('path') -var favicon = require('serve-favicon') -var logger = require('morgan') -var cookieParser = require('cookie-parser') -var bodyParser = require('body-parser') - -var index = require('./routes/index') -var users = require('./routes/users') -var add = require('./routes/add') - -var app = express() - -// view engine setup -app.set('views', path.join(__dirname, 'views')) -app.set('view engine', 'ejs') - -// uncomment after placing your favicon in /public -// app.use(favicon(path.join(__dirname, 'public', 'favicon.ico'))); -app.use(logger('dev')) -app.use(bodyParser.json()) -app.use(bodyParser.urlencoded({ extended: false })) -app.use(cookieParser()) -app.use(express.static(path.join(__dirname, 'public'))) - -app.use('/', index) -app.use('/users', users) -app.use('/add', add) - -// catch 404 and forward to error handler -app.use(function (req, res, next) { - var err = new Error('Not Found') - err.status = 404 - next(err) -}) - -// error handler -app.use(function (err, req, res, next) { - // set locals, only providing error in development - res.locals.message = err.message - res.locals.error = req.app.get('env') === 'development' ? err : {} - - // render the error page - res.status(err.status || 500) - res.render('error') -}) - -module.exports = app diff --git a/Chapter10/standardizing-service-boilerplate/micro/webapp/bin/www b/Chapter10/standardizing-service-boilerplate/micro/webapp/bin/www deleted file mode 100644 index 8715eeb..0000000 --- a/Chapter10/standardizing-service-boilerplate/micro/webapp/bin/www +++ /dev/null @@ -1,90 +0,0 @@ -#!/usr/bin/env node - -/** - * Module dependencies. - */ - -var app = require('../app'); -var debug = require('debug')('webapp:server'); -var http = require('http'); - -/** - * Get port from environment and store in Express. - */ - -var port = normalizePort(process.env.PORT || '3000'); -app.set('port', port); - -/** - * Create HTTP server. - */ - -var server = http.createServer(app); - -/** - * Listen on provided port, on all network interfaces. - */ - -server.listen(port); -server.on('error', onError); -server.on('listening', onListening); - -/** - * Normalize a port into a number, string, or false. - */ - -function normalizePort(val) { - var port = parseInt(val, 10); - - if (isNaN(port)) { - // named pipe - return val; - } - - if (port >= 0) { - // port number - return port; - } - - return false; -} - -/** - * Event listener for HTTP server "error" event. - */ - -function onError(error) { - if (error.syscall !== 'listen') { - throw error; - } - - var bind = typeof port === 'string' - ? 'Pipe ' + port - : 'Port ' + port; - - // handle specific listen errors with friendly messages - switch (error.code) { - case 'EACCES': - console.error(bind + ' requires elevated privileges'); - process.exit(1); - break; - case 'EADDRINUSE': - console.error(bind + ' is already in use'); - process.exit(1); - break; - default: - throw error; - } -} - -/** - * Event listener for HTTP server "listening" event. - */ - -function onListening() { - var addr = server.address(); - var bind = typeof addr === 'string' - ? 'pipe ' + addr - : 'port ' + addr.port; - debug('Listening on ' + bind); -} diff --git a/Chapter10/standardizing-service-boilerplate/micro/webapp/package.json b/Chapter10/standardizing-service-boilerplate/micro/webapp/package.json deleted file mode 100644 index c0d6ed3..0000000 --- a/Chapter10/standardizing-service-boilerplate/micro/webapp/package.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "name": "webapp", - "version": "0.0.0", - "private": true, - "scripts": { - "start": "node ./bin/www" - }, - "dependencies": { - "body-parser": "~1.16.0", - "cookie-parser": "~1.4.3", - "debug": "~2.6.0", - "ejs": "~2.5.5", - "express": "~4.14.1", - "morgan": "~1.7.0", - "mu": "^2.1.2", - "restify": "^4.3.0", - "serve-favicon": "~2.3.2" - } -} diff --git a/Chapter10/standardizing-service-boilerplate/micro/webapp/public/stylesheets/style.css b/Chapter10/standardizing-service-boilerplate/micro/webapp/public/stylesheets/style.css deleted file mode 100644 index 9453385..0000000 --- a/Chapter10/standardizing-service-boilerplate/micro/webapp/public/stylesheets/style.css +++ /dev/null @@ -1,8 +0,0 @@ -body { - padding: 50px; - font: 14px "Lucida Grande", Helvetica, Arial, sans-serif; -} - -a { - color: #00B7FF; -} diff --git a/Chapter10/standardizing-service-boilerplate/micro/webapp/routes/add.js b/Chapter10/standardizing-service-boilerplate/micro/webapp/routes/add.js deleted file mode 100644 index 2074c32..0000000 --- a/Chapter10/standardizing-service-boilerplate/micro/webapp/routes/add.js +++ /dev/null @@ -1,34 +0,0 @@ -'use strict' - -const { Router } = require('express') -const restify = require('restify') -const router = Router() - -const { - ADDERSERVICE_SERVICE_HOST, - ADDERSERVICE_SERVICE_PORT -} = process.env - -router.get('/', function (req, res) { - res.render('add', { first: 0, second: 0, result: 0 }) -}) - -router.post('/calculate', function (req, res, next) { - const client = restify.createJSONClient({ - url: `http://${ADDERSERVICE_SERVICE_HOST}:${ADDERSERVICE_SERVICE_PORT}` - }) - const { first, second } = req.body - client.get( - `/add/${first}/${second}`, - (err, svcReq, svcRes, data) => { - if (err) { - next(err) - return - } - const { result } = data - res.render('add', { first, second, result }) - } - ) -}) - -module.exports = router diff --git a/Chapter10/standardizing-service-boilerplate/micro/webapp/routes/index.js b/Chapter10/standardizing-service-boilerplate/micro/webapp/routes/index.js deleted file mode 100644 index 956680b..0000000 --- a/Chapter10/standardizing-service-boilerplate/micro/webapp/routes/index.js +++ /dev/null @@ -1,9 +0,0 @@ -var express = require('express') -var router = express.Router() - -/* GET home page. */ -router.get('/', function (req, res, next) { - res.render('index', { title: 'Express' }) -}) - -module.exports = router diff --git a/Chapter10/standardizing-service-boilerplate/micro/webapp/routes/users.js b/Chapter10/standardizing-service-boilerplate/micro/webapp/routes/users.js deleted file mode 100644 index 8cfe88f..0000000 --- a/Chapter10/standardizing-service-boilerplate/micro/webapp/routes/users.js +++ /dev/null @@ -1,9 +0,0 @@ -var express = require('express') -var router = express.Router() - -/* GET users listing. */ -router.get('/', function (req, res, next) { - res.send('respond with a resource') -}) - -module.exports = router diff --git a/Chapter10/standardizing-service-boilerplate/micro/webapp/views/add.ejs b/Chapter10/standardizing-service-boilerplate/micro/webapp/views/add.ejs deleted file mode 100644 index da8279c..0000000 --- a/Chapter10/standardizing-service-boilerplate/micro/webapp/views/add.ejs +++ /dev/null @@ -1,16 +0,0 @@ - - - - Add - - - -

Add it up!

-
- > - > -
- -

result = <%= result %>

- - diff --git a/Chapter10/standardizing-service-boilerplate/micro/webapp/views/error.ejs b/Chapter10/standardizing-service-boilerplate/micro/webapp/views/error.ejs deleted file mode 100644 index 7cf94ed..0000000 --- a/Chapter10/standardizing-service-boilerplate/micro/webapp/views/error.ejs +++ /dev/null @@ -1,3 +0,0 @@ -

<%= message %>

-

<%= error.status %>

-
<%= error.stack %>
diff --git a/Chapter10/standardizing-service-boilerplate/micro/webapp/views/index.ejs b/Chapter10/standardizing-service-boilerplate/micro/webapp/views/index.ejs deleted file mode 100644 index 7b7a1d6..0000000 --- a/Chapter10/standardizing-service-boilerplate/micro/webapp/views/index.ejs +++ /dev/null @@ -1,11 +0,0 @@ - - - - <%= title %> - - - -

<%= title %>

-

Welcome to <%= title %>

- - diff --git a/Chapter10/using-containerized-infrastructure/micro/adderservice/index.js b/Chapter10/using-containerized-infrastructure/micro/adderservice/index.js deleted file mode 100644 index 1f2d9cf..0000000 --- a/Chapter10/using-containerized-infrastructure/micro/adderservice/index.js +++ /dev/null @@ -1,7 +0,0 @@ -'use strict' - -const wiring = require('./wiring') -const service = require('./service')() - - -wiring(service) diff --git a/Chapter10/using-containerized-infrastructure/micro/adderservice/package.json b/Chapter10/using-containerized-infrastructure/micro/adderservice/package.json deleted file mode 100644 index 7cef23a..0000000 --- a/Chapter10/using-containerized-infrastructure/micro/adderservice/package.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "name": "adderservice", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "test": "tap test" - }, - "keywords": [], - "author": "Peter Elger", - "license": "ISC", - "dependencies": { - "restify": "^4.3.0" - }, - "devDependencies": { - "tap": "^10.3.1" - } -} diff --git a/Chapter10/using-containerized-infrastructure/micro/adderservice/service.js b/Chapter10/using-containerized-infrastructure/micro/adderservice/service.js deleted file mode 100644 index 9d0d175..0000000 --- a/Chapter10/using-containerized-infrastructure/micro/adderservice/service.js +++ /dev/null @@ -1,13 +0,0 @@ -'use strict' - -module.exports = service - -function service () { - function add (args, cb) { - const {first, second} = args - const result = (parseInt(first, 10) + parseInt(second, 10)) - cb(null, {result: result.toString()}) - } - - return { add } -} diff --git a/Chapter10/using-containerized-infrastructure/micro/adderservice/test/index.js b/Chapter10/using-containerized-infrastructure/micro/adderservice/test/index.js deleted file mode 100644 index 32c45e5..0000000 --- a/Chapter10/using-containerized-infrastructure/micro/adderservice/test/index.js +++ /dev/null @@ -1,13 +0,0 @@ -'use strict' - -const {test} = require('tap') -const service = require('../service')() - -test('test add', (t) => { - t.plan(2) - - service.add({first: 1, second: 2}, (err, answer) => { - t.error(err) - t.same(answer, {result: 3}) - }) -}) diff --git a/Chapter10/using-containerized-infrastructure/micro/adderservice/wiring.js b/Chapter10/using-containerized-infrastructure/micro/adderservice/wiring.js deleted file mode 100644 index 0ed018c..0000000 --- a/Chapter10/using-containerized-infrastructure/micro/adderservice/wiring.js +++ /dev/null @@ -1,27 +0,0 @@ -'use strict' - -const restify = require('restify') -const { ADDERSERVICE_SERVICE_PORT } = process.env - -module.exports = wiring - -function wiring (service) { - const server = restify.createServer() - - server.get('/add/:first/:second', (req, res, next) => { - service.add(req.params, (err, result) => { - if (err) { - res.send(err) - next() - return - } - res.send(200, result) - next() - }) - }) - - server.listen(ADDERSERVICE_SERVICE_PORT, '0.0.0.0', () => { - console.log('%s listening at %s', server.name, server.url) - }) -} - diff --git a/Chapter10/using-containerized-infrastructure/micro/auditservice/index.js b/Chapter10/using-containerized-infrastructure/micro/auditservice/index.js deleted file mode 100644 index 40a4677..0000000 --- a/Chapter10/using-containerized-infrastructure/micro/auditservice/index.js +++ /dev/null @@ -1,6 +0,0 @@ -'use strict' - -const wiring = require('./wiring') -const service = require('./service')() - -wiring(service) diff --git a/Chapter10/using-containerized-infrastructure/micro/auditservice/package.json b/Chapter10/using-containerized-infrastructure/micro/auditservice/package.json deleted file mode 100644 index 0231ff1..0000000 --- a/Chapter10/using-containerized-infrastructure/micro/auditservice/package.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "name": "auditservice", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" - }, - "keywords": [], - "author": "Peter Elger", - "license": "ISC", - "dependencies": { - "mongo": "^0.1.0", - "restify": "^4.3.0" - } -} diff --git a/Chapter10/using-containerized-infrastructure/micro/auditservice/service.js b/Chapter10/using-containerized-infrastructure/micro/auditservice/service.js deleted file mode 100644 index f6592f2..0000000 --- a/Chapter10/using-containerized-infrastructure/micro/auditservice/service.js +++ /dev/null @@ -1,58 +0,0 @@ -'use strict' - -const { MongoClient } = require('mongodb') -const { - MONGO_SERVICE_HOST, - MONGO_SERVICE_PORT -} = process.env -const url = `mongodb://${MONGO_SERVICE_HOST}:${MONGO_SERVICE_PORT}/audit` - -module.exports = service - -function service () { - function append (args, cb) { - MongoClient.connect(url, (err, db) => { - if (err) { - cb(err) - return - } - - const audit = db.collection('audit') - const data = { - ts: Date.now(), - calc: args.calc, - result: args.calcResult - } - - audit.insert(data, (err, result) => { - if (err) { - cb(err) - return - } - cb(null, {result: result.toString()}) - db.close() - }) - }) - } - - function list (args, cb) { - MongoClient.connect(url, (err, db) => { - if (err) { - cb(err) - return - } - const audit = db.collection('audit') - audit.find({}, {limit: 10}).toArray((err, docs) => { - if (err) { - cb(err) - return - } - cb(null, {list: docs}) - db.close() - }) - }) - } - - return { append, list } -} - diff --git a/Chapter10/using-containerized-infrastructure/micro/auditservice/wiring.js b/Chapter10/using-containerized-infrastructure/micro/auditservice/wiring.js deleted file mode 100644 index b18dce8..0000000 --- a/Chapter10/using-containerized-infrastructure/micro/auditservice/wiring.js +++ /dev/null @@ -1,39 +0,0 @@ -'use strict' - -const restify = require('restify') -const { AUDITSERVICE_SERVICE_PORT } = process.env - -module.exports = wiring - -function wiring (service) { - const server = restify.createServer() - - server.use(restify.bodyParser()) - - server.post('/append', (req, res, next) => { - service.append(req.params, (err, result) => { - if (err) { - res.send(err) - return - } - res.send(result) - next() - }) - }) - - server.get('/list', (req, res, next) => { - service.list(req.params, (err, result) => { - if (err) { - res.send(err) - return - } - res.send(200, result) - next() - }) - }) - - server.listen(AUDITSERVICE_SERVICE_PORT, '0.0.0.0', () => { - console.log('%s listening at %s', server.name, server.url) - }) -} - diff --git a/Chapter10/using-containerized-infrastructure/micro/fuge/fuge.yml b/Chapter10/using-containerized-infrastructure/micro/fuge/fuge.yml deleted file mode 100644 index c3311d4..0000000 --- a/Chapter10/using-containerized-infrastructure/micro/fuge/fuge.yml +++ /dev/null @@ -1,30 +0,0 @@ -fuge_global: - tail: true - monitor: true - monitor_excludes: - - '**/node_modules/**' - - '**/.git/**' - - '*.log' -adderservice: - type: process - path: ../adderservice - run: node index.js - ports: - - main=8080 -webapp: - type: process - path: ../webapp - run: npm start - ports: - - main=3000 -auditservice: - type: process - path: ../auditservice - run: 'node index.js' - ports: - - main=8081 -mongo: - image: mongo - type: container - ports: - - main=27017:27017 diff --git a/Chapter10/using-containerized-infrastructure/micro/fuge/fuge2.yml b/Chapter10/using-containerized-infrastructure/micro/fuge/fuge2.yml deleted file mode 100644 index e5c2a4b..0000000 --- a/Chapter10/using-containerized-infrastructure/micro/fuge/fuge2.yml +++ /dev/null @@ -1,31 +0,0 @@ -fuge_global: - run_containers: false - tail: true - monitor: true - monitor_excludes: - - '**/node_modules/**' - - '**/.git/**' - - '*.log' -adderservice: - type: process - path: ../adderservice - run: node index.js - ports: - - main=8080 -webapp: - type: process - path: ../webapp - run: npm start - ports: - - main=3000 -auditservice: - type: process - path: ../auditservice - run: 'node index.js' - ports: - - main=8081 -mongo: - image: mongo - type: container - ports: - - main=27017:27017 diff --git a/Chapter10/using-containerized-infrastructure/micro/webapp/app.js b/Chapter10/using-containerized-infrastructure/micro/webapp/app.js deleted file mode 100644 index ec527f4..0000000 --- a/Chapter10/using-containerized-infrastructure/micro/webapp/app.js +++ /dev/null @@ -1,50 +0,0 @@ -var express = require('express') -var path = require('path') -var favicon = require('serve-favicon') -var logger = require('morgan') -var cookieParser = require('cookie-parser') -var bodyParser = require('body-parser') - -var index = require('./routes/index') -var users = require('./routes/users') -var add = require('./routes/add') -var audit = require('./routes/audit') - -var app = express() - -// view engine setup -app.set('views', path.join(__dirname, 'views')) -app.set('view engine', 'ejs') - -// uncomment after placing your favicon in /public -// app.use(favicon(path.join(__dirname, 'public', 'favicon.ico'))); -app.use(logger('dev')) -app.use(bodyParser.json()) -app.use(bodyParser.urlencoded({ extended: false })) -app.use(cookieParser()) -app.use(express.static(path.join(__dirname, 'public'))) - -app.use('/', index) -app.use('/users', users) -app.use('/add', add) -app.use('/audit', audit) - -// catch 404 and forward to error handler -app.use(function (req, res, next) { - var err = new Error('Not Found') - err.status = 404 - next(err) -}) - -// error handler -app.use(function (err, req, res, next) { - // set locals, only providing error in development - res.locals.message = err.message - res.locals.error = req.app.get('env') === 'development' ? err : {} - - // render the error page - res.status(err.status || 500) - res.render('error') -}) - -module.exports = app diff --git a/Chapter10/using-containerized-infrastructure/micro/webapp/bin/www b/Chapter10/using-containerized-infrastructure/micro/webapp/bin/www deleted file mode 100644 index 8715eeb..0000000 --- a/Chapter10/using-containerized-infrastructure/micro/webapp/bin/www +++ /dev/null @@ -1,90 +0,0 @@ -#!/usr/bin/env node - -/** - * Module dependencies. - */ - -var app = require('../app'); -var debug = require('debug')('webapp:server'); -var http = require('http'); - -/** - * Get port from environment and store in Express. - */ - -var port = normalizePort(process.env.PORT || '3000'); -app.set('port', port); - -/** - * Create HTTP server. - */ - -var server = http.createServer(app); - -/** - * Listen on provided port, on all network interfaces. - */ - -server.listen(port); -server.on('error', onError); -server.on('listening', onListening); - -/** - * Normalize a port into a number, string, or false. - */ - -function normalizePort(val) { - var port = parseInt(val, 10); - - if (isNaN(port)) { - // named pipe - return val; - } - - if (port >= 0) { - // port number - return port; - } - - return false; -} - -/** - * Event listener for HTTP server "error" event. - */ - -function onError(error) { - if (error.syscall !== 'listen') { - throw error; - } - - var bind = typeof port === 'string' - ? 'Pipe ' + port - : 'Port ' + port; - - // handle specific listen errors with friendly messages - switch (error.code) { - case 'EACCES': - console.error(bind + ' requires elevated privileges'); - process.exit(1); - break; - case 'EADDRINUSE': - console.error(bind + ' is already in use'); - process.exit(1); - break; - default: - throw error; - } -} - -/** - * Event listener for HTTP server "listening" event. - */ - -function onListening() { - var addr = server.address(); - var bind = typeof addr === 'string' - ? 'pipe ' + addr - : 'port ' + addr.port; - debug('Listening on ' + bind); -} diff --git a/Chapter10/using-containerized-infrastructure/micro/webapp/package.json b/Chapter10/using-containerized-infrastructure/micro/webapp/package.json deleted file mode 100644 index c0d6ed3..0000000 --- a/Chapter10/using-containerized-infrastructure/micro/webapp/package.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "name": "webapp", - "version": "0.0.0", - "private": true, - "scripts": { - "start": "node ./bin/www" - }, - "dependencies": { - "body-parser": "~1.16.0", - "cookie-parser": "~1.4.3", - "debug": "~2.6.0", - "ejs": "~2.5.5", - "express": "~4.14.1", - "morgan": "~1.7.0", - "mu": "^2.1.2", - "restify": "^4.3.0", - "serve-favicon": "~2.3.2" - } -} diff --git a/Chapter10/using-containerized-infrastructure/micro/webapp/public/stylesheets/style.css b/Chapter10/using-containerized-infrastructure/micro/webapp/public/stylesheets/style.css deleted file mode 100644 index 9453385..0000000 --- a/Chapter10/using-containerized-infrastructure/micro/webapp/public/stylesheets/style.css +++ /dev/null @@ -1,8 +0,0 @@ -body { - padding: 50px; - font: 14px "Lucida Grande", Helvetica, Arial, sans-serif; -} - -a { - color: #00B7FF; -} diff --git a/Chapter10/using-containerized-infrastructure/micro/webapp/routes/add.js b/Chapter10/using-containerized-infrastructure/micro/webapp/routes/add.js deleted file mode 100644 index 2744945..0000000 --- a/Chapter10/using-containerized-infrastructure/micro/webapp/routes/add.js +++ /dev/null @@ -1,49 +0,0 @@ -'use strict' - -const { Router } = require('express') -const restify = require('restify') -const router = Router() - -const { - ADDERSERVICE_SERVICE_HOST, - ADDERSERVICE_SERVICE_PORT, - AUDITSERVICE_SERVICE_HOST, - AUDITSERVICE_SERVICE_PORT, -} = process.env - -router.get('/', function (req, res) { - res.render('add', { first: 0, second: 0, result: 0 }) -}) - -router.post('/calculate', function (req, res, next) { - const clients = { - adder: restify.createJSONClient({ - url: `http://${ADDERSERVICE_SERVICE_HOST}:${ADDERSERVICE_SERVICE_PORT}` - }), - audit: restify.createJSONClient({ - url: `http://${AUDITSERVICE_SERVICE_HOST}:${AUDITSERVICE_SERVICE_PORT}` - }) - } - const { first, second } = req.body - clients.adder.get( - `/add/${first}/${second}`, - (err, svcReq, svcRes, data) => { - if (err) { - next(err) - return - } - - const { result } = data - clients.audit.post('/append', { - calc: first + '+' + second, - calcResult: result - }, (err) => { - if (err) console.error(err) - }) - - res.render('add', { first, second, result }) - } - ) -}) - -module.exports = router diff --git a/Chapter10/using-containerized-infrastructure/micro/webapp/routes/audit.js b/Chapter10/using-containerized-infrastructure/micro/webapp/routes/audit.js deleted file mode 100644 index 1385f8f..0000000 --- a/Chapter10/using-containerized-infrastructure/micro/webapp/routes/audit.js +++ /dev/null @@ -1,25 +0,0 @@ -'use strict' - -const { Router } = require('express') -const restify = require('restify') -const router = Router() - -const { - AUDITSERVICE_SERVICE_HOST, - AUDITSERVICE_SERVICE_PORT -} = process.env - -router.get('/', (req, res, next) => { - const url = `http://${AUDITSERVICE_SERVICE_HOST}:${AUDITSERVICE_SERVICE_PORT}` - const client = restify.createJsonClient({ url }) - - client.get('/list', (err, svcReq, svcRes, data) => { - if (err) { - next(err) - return - } - res.render('audit', data) - }) -}) - -module.exports = router diff --git a/Chapter10/using-containerized-infrastructure/micro/webapp/routes/index.js b/Chapter10/using-containerized-infrastructure/micro/webapp/routes/index.js deleted file mode 100644 index 956680b..0000000 --- a/Chapter10/using-containerized-infrastructure/micro/webapp/routes/index.js +++ /dev/null @@ -1,9 +0,0 @@ -var express = require('express') -var router = express.Router() - -/* GET home page. */ -router.get('/', function (req, res, next) { - res.render('index', { title: 'Express' }) -}) - -module.exports = router diff --git a/Chapter10/using-containerized-infrastructure/micro/webapp/routes/users.js b/Chapter10/using-containerized-infrastructure/micro/webapp/routes/users.js deleted file mode 100644 index 8cfe88f..0000000 --- a/Chapter10/using-containerized-infrastructure/micro/webapp/routes/users.js +++ /dev/null @@ -1,9 +0,0 @@ -var express = require('express') -var router = express.Router() - -/* GET users listing. */ -router.get('/', function (req, res, next) { - res.send('respond with a resource') -}) - -module.exports = router diff --git a/Chapter10/using-containerized-infrastructure/micro/webapp/views/add.ejs b/Chapter10/using-containerized-infrastructure/micro/webapp/views/add.ejs deleted file mode 100644 index da8279c..0000000 --- a/Chapter10/using-containerized-infrastructure/micro/webapp/views/add.ejs +++ /dev/null @@ -1,16 +0,0 @@ - - - - Add - - - -

Add it up!

-
- > - > -
- -

result = <%= result %>

- - diff --git a/Chapter10/using-containerized-infrastructure/micro/webapp/views/audit.ejs b/Chapter10/using-containerized-infrastructure/micro/webapp/views/audit.ejs deleted file mode 100644 index dd6d71b..0000000 --- a/Chapter10/using-containerized-infrastructure/micro/webapp/views/audit.ejs +++ /dev/null @@ -1,15 +0,0 @@ - - - - Audit - - - -

Calculation History

-
    - <% list.forEach(function (el) { %> -
  • at: <%= new Date(el.ts).toLocaleString() %>, calculated: <%= el.calc %>, result: <%= el.result %>
  • - <% }) %> -
- - \ No newline at end of file diff --git a/Chapter10/using-containerized-infrastructure/micro/webapp/views/error.ejs b/Chapter10/using-containerized-infrastructure/micro/webapp/views/error.ejs deleted file mode 100644 index 7cf94ed..0000000 --- a/Chapter10/using-containerized-infrastructure/micro/webapp/views/error.ejs +++ /dev/null @@ -1,3 +0,0 @@ -

<%= message %>

-

<%= error.status %>

-
<%= error.stack %>
diff --git a/Chapter10/using-containerized-infrastructure/micro/webapp/views/index.ejs b/Chapter10/using-containerized-infrastructure/micro/webapp/views/index.ejs deleted file mode 100644 index 7b7a1d6..0000000 --- a/Chapter10/using-containerized-infrastructure/micro/webapp/views/index.ejs +++ /dev/null @@ -1,11 +0,0 @@ - - - - <%= title %> - - - -

<%= title %>

-

Welcome to <%= title %>

- - diff --git a/Chapter11/building-a-single-container/micro/adderservice/.dockerignore b/Chapter11/building-a-single-container/micro/adderservice/.dockerignore deleted file mode 100644 index 90718e6..0000000 --- a/Chapter11/building-a-single-container/micro/adderservice/.dockerignore +++ /dev/null @@ -1,4 +0,0 @@ -.git -.gitignore -node_modules -npm-debug.log diff --git a/Chapter11/building-a-single-container/micro/adderservice/Dockerfile b/Chapter11/building-a-single-container/micro/adderservice/Dockerfile deleted file mode 100644 index 4d2e56b..0000000 --- a/Chapter11/building-a-single-container/micro/adderservice/Dockerfile +++ /dev/null @@ -1,7 +0,0 @@ -FROM node:slim -RUN mkdir -p /home/node/service -WORKDIR /home/node/service -COPY package.json /home/node/service -RUN npm install -COPY . /home/node/service -CMD [ "node", "index.js" ] diff --git a/Chapter11/building-a-single-container/micro/adderservice/index.js b/Chapter11/building-a-single-container/micro/adderservice/index.js deleted file mode 100644 index 753a4ce..0000000 --- a/Chapter11/building-a-single-container/micro/adderservice/index.js +++ /dev/null @@ -1,6 +0,0 @@ -'use strict' - -const wiring = require('./wiring') -const service = require('./service')() - -wiring(service) \ No newline at end of file diff --git a/Chapter11/building-a-single-container/micro/adderservice/package.json b/Chapter11/building-a-single-container/micro/adderservice/package.json deleted file mode 100644 index 595a5b0..0000000 --- a/Chapter11/building-a-single-container/micro/adderservice/package.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "name": "adder-service", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" - }, - "keywords": [], - "author": "Peter Elger ", - "license": "ISC", - "dependencies": { - "restify": "^4.3.0" - } -} diff --git a/Chapter11/building-a-single-container/micro/adderservice/service.js b/Chapter11/building-a-single-container/micro/adderservice/service.js deleted file mode 100644 index af95084..0000000 --- a/Chapter11/building-a-single-container/micro/adderservice/service.js +++ /dev/null @@ -1,13 +0,0 @@ -'use strict' - -module.exports = service - -function service () { - function add (args, cb) { - const {first, second} = args - const result = (parseInt(first, 10) + parseInt(second, 10)) - cb(null, {result: result.toString()}) - } - - return { add } -} \ No newline at end of file diff --git a/Chapter11/building-a-single-container/micro/adderservice/wiring.js b/Chapter11/building-a-single-container/micro/adderservice/wiring.js deleted file mode 100644 index 0e81c6c..0000000 --- a/Chapter11/building-a-single-container/micro/adderservice/wiring.js +++ /dev/null @@ -1,26 +0,0 @@ -'use strict' - -const restify = require('restify') -const { ADDERSERVICE_SERVICE_PORT } = process.env - -module.exports = wiring - -function wiring (service) { - const server = restify.createServer() - - server.get('/add/:first/:second', (req, res, next) => { - service.add(req.params, (err, result) => { - if (err) { - res.send(err) - next() - return - } - res.send(200, result) - next() - }) - }) - - server.listen(ADDERSERVICE_SERVICE_PORT, '0.0.0.0', () => { - console.log('%s listening at %s', server.name, server.url) - }) -} \ No newline at end of file diff --git a/Chapter11/building-a-single-container/test.sh b/Chapter11/building-a-single-container/test.sh deleted file mode 100644 index 5086478..0000000 --- a/Chapter11/building-a-single-container/test.sh +++ /dev/null @@ -1 +0,0 @@ -curl http://localhost:8080/add/2/3 diff --git a/Chapter11/creating-a-deployment-pipeline/micro/adderservice/.dockerignore b/Chapter11/creating-a-deployment-pipeline/micro/adderservice/.dockerignore deleted file mode 100644 index 90718e6..0000000 --- a/Chapter11/creating-a-deployment-pipeline/micro/adderservice/.dockerignore +++ /dev/null @@ -1,4 +0,0 @@ -.git -.gitignore -node_modules -npm-debug.log diff --git a/Chapter11/creating-a-deployment-pipeline/micro/adderservice/Dockerfile b/Chapter11/creating-a-deployment-pipeline/micro/adderservice/Dockerfile deleted file mode 100644 index 4d2e56b..0000000 --- a/Chapter11/creating-a-deployment-pipeline/micro/adderservice/Dockerfile +++ /dev/null @@ -1,7 +0,0 @@ -FROM node:slim -RUN mkdir -p /home/node/service -WORKDIR /home/node/service -COPY package.json /home/node/service -RUN npm install -COPY . /home/node/service -CMD [ "node", "index.js" ] diff --git a/Chapter11/creating-a-deployment-pipeline/micro/adderservice/Jenkinsfile b/Chapter11/creating-a-deployment-pipeline/micro/adderservice/Jenkinsfile deleted file mode 100644 index 8ea826e..0000000 --- a/Chapter11/creating-a-deployment-pipeline/micro/adderservice/Jenkinsfile +++ /dev/null @@ -1,32 +0,0 @@ -pipeline { - agent any - - stages { - stage('Checkout') { - steps { - checkout scm - } - } - stage('Build') { - steps { - sh 'source ~/.bashrc && cd adderservice && npm install' - } - } - stage('Test'){ - steps { - sh 'source ~/.bashrc && cd adderservice && npm test' - } - } - stage('Container'){ - steps { - sh 'source ~/.bashrc && cd adderservice && sh build.sh container' - } - } - stage('Deploy'){ - steps { - sh 'source ~/.bashrc && cd adderservice && sh build.sh deploy' - } - } - } -} - diff --git a/Chapter11/creating-a-deployment-pipeline/micro/adderservice/build.sh b/Chapter11/creating-a-deployment-pipeline/micro/adderservice/build.sh deleted file mode 100644 index 7da8cb6..0000000 --- a/Chapter11/creating-a-deployment-pipeline/micro/adderservice/build.sh +++ /dev/null @@ -1,23 +0,0 @@ -#!/bin/bash -source ~/.bashrc - -GITSHA=$(git rev-parse --short HEAD) - -case "$1" in - container) - sudo -u pelger docker build -t adderservice:$GITSHA . - sudo -u pelger docker tag adderservice:$GITSHA pelger/adderservice:$GITSHA - sudo -i -u pelger docker push pelger/adderservice:$GITSHA - ;; - deploy) - sed -e s/_NAME_/adderservice/ -e s/_PORT_/8080/ < ../deployment/service-template.yml > svc.yml - sed -e s/_NAME_/adderservice/ -e s/_PORT_/8080/ -e s/_IMAGE_/pelger\\/adderservice:$GITSHA/ < ../deployment/deployment-template.yml > dep.yml - sudo -i -u pelger kubectl apply -f $(pwd)/svc.yml - sudo -i -u pelger kubectl apply -f $(pwd)/dep.yml - ;; - *) - echo 'invalid build command' - exit 1 - ;; -esac - diff --git a/Chapter11/creating-a-deployment-pipeline/micro/adderservice/index.js b/Chapter11/creating-a-deployment-pipeline/micro/adderservice/index.js deleted file mode 100644 index 1f2d9cf..0000000 --- a/Chapter11/creating-a-deployment-pipeline/micro/adderservice/index.js +++ /dev/null @@ -1,7 +0,0 @@ -'use strict' - -const wiring = require('./wiring') -const service = require('./service')() - - -wiring(service) diff --git a/Chapter11/creating-a-deployment-pipeline/micro/adderservice/package.json b/Chapter11/creating-a-deployment-pipeline/micro/adderservice/package.json deleted file mode 100644 index 7cef23a..0000000 --- a/Chapter11/creating-a-deployment-pipeline/micro/adderservice/package.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "name": "adderservice", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "test": "tap test" - }, - "keywords": [], - "author": "Peter Elger", - "license": "ISC", - "dependencies": { - "restify": "^4.3.0" - }, - "devDependencies": { - "tap": "^10.3.1" - } -} diff --git a/Chapter11/creating-a-deployment-pipeline/micro/adderservice/service.js b/Chapter11/creating-a-deployment-pipeline/micro/adderservice/service.js deleted file mode 100644 index 9d0d175..0000000 --- a/Chapter11/creating-a-deployment-pipeline/micro/adderservice/service.js +++ /dev/null @@ -1,13 +0,0 @@ -'use strict' - -module.exports = service - -function service () { - function add (args, cb) { - const {first, second} = args - const result = (parseInt(first, 10) + parseInt(second, 10)) - cb(null, {result: result.toString()}) - } - - return { add } -} diff --git a/Chapter11/creating-a-deployment-pipeline/micro/adderservice/wiring.js b/Chapter11/creating-a-deployment-pipeline/micro/adderservice/wiring.js deleted file mode 100644 index 0ed018c..0000000 --- a/Chapter11/creating-a-deployment-pipeline/micro/adderservice/wiring.js +++ /dev/null @@ -1,27 +0,0 @@ -'use strict' - -const restify = require('restify') -const { ADDERSERVICE_SERVICE_PORT } = process.env - -module.exports = wiring - -function wiring (service) { - const server = restify.createServer() - - server.get('/add/:first/:second', (req, res, next) => { - service.add(req.params, (err, result) => { - if (err) { - res.send(err) - next() - return - } - res.send(200, result) - next() - }) - }) - - server.listen(ADDERSERVICE_SERVICE_PORT, '0.0.0.0', () => { - console.log('%s listening at %s', server.name, server.url) - }) -} - diff --git a/Chapter11/creating-a-deployment-pipeline/micro/deployment/deployment-template.yml b/Chapter11/creating-a-deployment-pipeline/micro/deployment/deployment-template.yml deleted file mode 100644 index 42ee070..0000000 --- a/Chapter11/creating-a-deployment-pipeline/micro/deployment/deployment-template.yml +++ /dev/null @@ -1,17 +0,0 @@ -apiVersion: extensions/v1beta1 -kind: Deployment -metadata: - name: _NAME_ -spec: - replicas: 1 - template: - metadata: - labels: - run: _NAME_ - spec: - containers: - - name: _NAME_ - image: _IMAGE_ - ports: - - containerPort: _PORT_ - diff --git a/Chapter11/creating-a-deployment-pipeline/micro/deployment/namespace.yml b/Chapter11/creating-a-deployment-pipeline/micro/deployment/namespace.yml deleted file mode 100644 index 1351cbb..0000000 --- a/Chapter11/creating-a-deployment-pipeline/micro/deployment/namespace.yml +++ /dev/null @@ -1,6 +0,0 @@ -apiVersion: v1 -kind: Namespace -metadata: - name: micro - labels: - name: micro diff --git a/Chapter11/creating-a-deployment-pipeline/micro/deployment/service-template.yml b/Chapter11/creating-a-deployment-pipeline/micro/deployment/service-template.yml deleted file mode 100644 index 11010f6..0000000 --- a/Chapter11/creating-a-deployment-pipeline/micro/deployment/service-template.yml +++ /dev/null @@ -1,16 +0,0 @@ -apiVersion: v1 -kind: Service -metadata: - name: _NAME_ - labels: - run: _NAME_ -spec: - ports: - - port: _PORT_ - name: main - protocol: TCP - targetPort: _PORT_ - selector: - run: _NAME_ - type: NodePort - diff --git a/Chapter11/deploying-a-container-to-kubernetes/micro/adderservice/.dockerignore b/Chapter11/deploying-a-container-to-kubernetes/micro/adderservice/.dockerignore deleted file mode 100644 index 90718e6..0000000 --- a/Chapter11/deploying-a-container-to-kubernetes/micro/adderservice/.dockerignore +++ /dev/null @@ -1,4 +0,0 @@ -.git -.gitignore -node_modules -npm-debug.log diff --git a/Chapter11/deploying-a-container-to-kubernetes/micro/adderservice/Dockerfile b/Chapter11/deploying-a-container-to-kubernetes/micro/adderservice/Dockerfile deleted file mode 100644 index 4d2e56b..0000000 --- a/Chapter11/deploying-a-container-to-kubernetes/micro/adderservice/Dockerfile +++ /dev/null @@ -1,7 +0,0 @@ -FROM node:slim -RUN mkdir -p /home/node/service -WORKDIR /home/node/service -COPY package.json /home/node/service -RUN npm install -COPY . /home/node/service -CMD [ "node", "index.js" ] diff --git a/Chapter11/deploying-a-container-to-kubernetes/micro/adderservice/index.js b/Chapter11/deploying-a-container-to-kubernetes/micro/adderservice/index.js deleted file mode 100644 index 753a4ce..0000000 --- a/Chapter11/deploying-a-container-to-kubernetes/micro/adderservice/index.js +++ /dev/null @@ -1,6 +0,0 @@ -'use strict' - -const wiring = require('./wiring') -const service = require('./service')() - -wiring(service) \ No newline at end of file diff --git a/Chapter11/deploying-a-container-to-kubernetes/micro/adderservice/package.json b/Chapter11/deploying-a-container-to-kubernetes/micro/adderservice/package.json deleted file mode 100644 index 595a5b0..0000000 --- a/Chapter11/deploying-a-container-to-kubernetes/micro/adderservice/package.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "name": "adder-service", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" - }, - "keywords": [], - "author": "Peter Elger ", - "license": "ISC", - "dependencies": { - "restify": "^4.3.0" - } -} diff --git a/Chapter11/deploying-a-container-to-kubernetes/micro/adderservice/service.js b/Chapter11/deploying-a-container-to-kubernetes/micro/adderservice/service.js deleted file mode 100644 index af95084..0000000 --- a/Chapter11/deploying-a-container-to-kubernetes/micro/adderservice/service.js +++ /dev/null @@ -1,13 +0,0 @@ -'use strict' - -module.exports = service - -function service () { - function add (args, cb) { - const {first, second} = args - const result = (parseInt(first, 10) + parseInt(second, 10)) - cb(null, {result: result.toString()}) - } - - return { add } -} \ No newline at end of file diff --git a/Chapter11/deploying-a-container-to-kubernetes/micro/adderservice/wiring.js b/Chapter11/deploying-a-container-to-kubernetes/micro/adderservice/wiring.js deleted file mode 100644 index 0e81c6c..0000000 --- a/Chapter11/deploying-a-container-to-kubernetes/micro/adderservice/wiring.js +++ /dev/null @@ -1,26 +0,0 @@ -'use strict' - -const restify = require('restify') -const { ADDERSERVICE_SERVICE_PORT } = process.env - -module.exports = wiring - -function wiring (service) { - const server = restify.createServer() - - server.get('/add/:first/:second', (req, res, next) => { - service.add(req.params, (err, result) => { - if (err) { - res.send(err) - next() - return - } - res.send(200, result) - next() - }) - }) - - server.listen(ADDERSERVICE_SERVICE_PORT, '0.0.0.0', () => { - console.log('%s listening at %s', server.name, server.url) - }) -} \ No newline at end of file diff --git a/Chapter11/deploying-a-container-to-kubernetes/micro/deployment/adderservice-dep.yml b/Chapter11/deploying-a-container-to-kubernetes/micro/deployment/adderservice-dep.yml deleted file mode 100644 index 65b998f..0000000 --- a/Chapter11/deploying-a-container-to-kubernetes/micro/deployment/adderservice-dep.yml +++ /dev/null @@ -1,16 +0,0 @@ -apiVersion: extensions/v1beta1 -kind: Deployment -metadata: - name: adderservice -spec: - replicas: 1 - template: - metadata: - labels: - run: adderservice - spec: - containers: - - name: adderservice - image: pelger/adderservice - ports: - - containerPort: 8080 diff --git a/Chapter11/deploying-a-container-to-kubernetes/micro/deployment/adderservice-svc.yml b/Chapter11/deploying-a-container-to-kubernetes/micro/deployment/adderservice-svc.yml deleted file mode 100644 index 5327532..0000000 --- a/Chapter11/deploying-a-container-to-kubernetes/micro/deployment/adderservice-svc.yml +++ /dev/null @@ -1,15 +0,0 @@ -apiVersion: v1 -kind: Service -metadata: - name: adderservice - labels: - run: adderservice -spec: - ports: - - port: 8080 - name: main - protocol: TCP - targetPort: 8080 - selector: - run: adderservice - type: NodePort diff --git a/Chapter11/deploying-a-container-to-kubernetes/micro/deployment/namespace.yml b/Chapter11/deploying-a-container-to-kubernetes/micro/deployment/namespace.yml deleted file mode 100644 index 1351cbb..0000000 --- a/Chapter11/deploying-a-container-to-kubernetes/micro/deployment/namespace.yml +++ /dev/null @@ -1,6 +0,0 @@ -apiVersion: v1 -kind: Namespace -metadata: - name: micro - labels: - name: micro diff --git a/Chapter11/deploying-a-container-to-kubernetes/micro2/adderservice/.dockerignore b/Chapter11/deploying-a-container-to-kubernetes/micro2/adderservice/.dockerignore deleted file mode 100644 index 90718e6..0000000 --- a/Chapter11/deploying-a-container-to-kubernetes/micro2/adderservice/.dockerignore +++ /dev/null @@ -1,4 +0,0 @@ -.git -.gitignore -node_modules -npm-debug.log diff --git a/Chapter11/deploying-a-container-to-kubernetes/micro2/adderservice/Dockerfile b/Chapter11/deploying-a-container-to-kubernetes/micro2/adderservice/Dockerfile deleted file mode 100644 index 4d2e56b..0000000 --- a/Chapter11/deploying-a-container-to-kubernetes/micro2/adderservice/Dockerfile +++ /dev/null @@ -1,7 +0,0 @@ -FROM node:slim -RUN mkdir -p /home/node/service -WORKDIR /home/node/service -COPY package.json /home/node/service -RUN npm install -COPY . /home/node/service -CMD [ "node", "index.js" ] diff --git a/Chapter11/deploying-a-container-to-kubernetes/micro2/adderservice/index.js b/Chapter11/deploying-a-container-to-kubernetes/micro2/adderservice/index.js deleted file mode 100644 index 753a4ce..0000000 --- a/Chapter11/deploying-a-container-to-kubernetes/micro2/adderservice/index.js +++ /dev/null @@ -1,6 +0,0 @@ -'use strict' - -const wiring = require('./wiring') -const service = require('./service')() - -wiring(service) \ No newline at end of file diff --git a/Chapter11/deploying-a-container-to-kubernetes/micro2/adderservice/package.json b/Chapter11/deploying-a-container-to-kubernetes/micro2/adderservice/package.json deleted file mode 100644 index 595a5b0..0000000 --- a/Chapter11/deploying-a-container-to-kubernetes/micro2/adderservice/package.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "name": "adder-service", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" - }, - "keywords": [], - "author": "Peter Elger ", - "license": "ISC", - "dependencies": { - "restify": "^4.3.0" - } -} diff --git a/Chapter11/deploying-a-container-to-kubernetes/micro2/adderservice/service.js b/Chapter11/deploying-a-container-to-kubernetes/micro2/adderservice/service.js deleted file mode 100644 index d7510a9..0000000 --- a/Chapter11/deploying-a-container-to-kubernetes/micro2/adderservice/service.js +++ /dev/null @@ -1,14 +0,0 @@ -'use strict' - -module.exports = service - -function service () { - function add (args, cb) { - const {first, second} = args - console.log(`add called: ${first} ${second}`) - const result = (parseInt(first, 10) + parseInt(second, 10)) - cb(null, {result: result.toString()}) - } - - return { add } -} \ No newline at end of file diff --git a/Chapter11/deploying-a-container-to-kubernetes/micro2/adderservice/wiring.js b/Chapter11/deploying-a-container-to-kubernetes/micro2/adderservice/wiring.js deleted file mode 100644 index 0e81c6c..0000000 --- a/Chapter11/deploying-a-container-to-kubernetes/micro2/adderservice/wiring.js +++ /dev/null @@ -1,26 +0,0 @@ -'use strict' - -const restify = require('restify') -const { ADDERSERVICE_SERVICE_PORT } = process.env - -module.exports = wiring - -function wiring (service) { - const server = restify.createServer() - - server.get('/add/:first/:second', (req, res, next) => { - service.add(req.params, (err, result) => { - if (err) { - res.send(err) - next() - return - } - res.send(200, result) - next() - }) - }) - - server.listen(ADDERSERVICE_SERVICE_PORT, '0.0.0.0', () => { - console.log('%s listening at %s', server.name, server.url) - }) -} \ No newline at end of file diff --git a/Chapter11/deploying-a-container-to-kubernetes/micro2/deployment/adderservice-dep.yml b/Chapter11/deploying-a-container-to-kubernetes/micro2/deployment/adderservice-dep.yml deleted file mode 100644 index 540d543..0000000 --- a/Chapter11/deploying-a-container-to-kubernetes/micro2/deployment/adderservice-dep.yml +++ /dev/null @@ -1,16 +0,0 @@ -apiVersion: extensions/v1beta1 -kind: Deployment -metadata: - name: adderservice -spec: - replicas: 1 - template: - metadata: - labels: - run: adderservice - spec: - containers: - - name: adderservice - image: pelger/adderservice:2 - ports: - - containerPort: 8080 diff --git a/Chapter11/deploying-a-container-to-kubernetes/micro2/deployment/adderservice-svc.yml b/Chapter11/deploying-a-container-to-kubernetes/micro2/deployment/adderservice-svc.yml deleted file mode 100644 index 5327532..0000000 --- a/Chapter11/deploying-a-container-to-kubernetes/micro2/deployment/adderservice-svc.yml +++ /dev/null @@ -1,15 +0,0 @@ -apiVersion: v1 -kind: Service -metadata: - name: adderservice - labels: - run: adderservice -spec: - ports: - - port: 8080 - name: main - protocol: TCP - targetPort: 8080 - selector: - run: adderservice - type: NodePort diff --git a/Chapter11/deploying-a-container-to-kubernetes/micro2/deployment/namespace.yml b/Chapter11/deploying-a-container-to-kubernetes/micro2/deployment/namespace.yml deleted file mode 100644 index 1351cbb..0000000 --- a/Chapter11/deploying-a-container-to-kubernetes/micro2/deployment/namespace.yml +++ /dev/null @@ -1,6 +0,0 @@ -apiVersion: v1 -kind: Namespace -metadata: - name: micro - labels: - name: micro diff --git a/Chapter11/deploying-a-container-to-kubernetes/test.sh b/Chapter11/deploying-a-container-to-kubernetes/test.sh deleted file mode 100644 index 5086478..0000000 --- a/Chapter11/deploying-a-container-to-kubernetes/test.sh +++ /dev/null @@ -1 +0,0 @@ -curl http://localhost:8080/add/2/3 diff --git a/Chapter11/deploying-a-full-system/micro/adderservice/.dockerignore b/Chapter11/deploying-a-full-system/micro/adderservice/.dockerignore deleted file mode 100644 index 90718e6..0000000 --- a/Chapter11/deploying-a-full-system/micro/adderservice/.dockerignore +++ /dev/null @@ -1,4 +0,0 @@ -.git -.gitignore -node_modules -npm-debug.log diff --git a/Chapter11/deploying-a-full-system/micro/adderservice/Dockerfile b/Chapter11/deploying-a-full-system/micro/adderservice/Dockerfile deleted file mode 100644 index 4d2e56b..0000000 --- a/Chapter11/deploying-a-full-system/micro/adderservice/Dockerfile +++ /dev/null @@ -1,7 +0,0 @@ -FROM node:slim -RUN mkdir -p /home/node/service -WORKDIR /home/node/service -COPY package.json /home/node/service -RUN npm install -COPY . /home/node/service -CMD [ "node", "index.js" ] diff --git a/Chapter11/deploying-a-full-system/micro/adderservice/Jenkinsfile b/Chapter11/deploying-a-full-system/micro/adderservice/Jenkinsfile deleted file mode 100644 index 8ea826e..0000000 --- a/Chapter11/deploying-a-full-system/micro/adderservice/Jenkinsfile +++ /dev/null @@ -1,32 +0,0 @@ -pipeline { - agent any - - stages { - stage('Checkout') { - steps { - checkout scm - } - } - stage('Build') { - steps { - sh 'source ~/.bashrc && cd adderservice && npm install' - } - } - stage('Test'){ - steps { - sh 'source ~/.bashrc && cd adderservice && npm test' - } - } - stage('Container'){ - steps { - sh 'source ~/.bashrc && cd adderservice && sh build.sh container' - } - } - stage('Deploy'){ - steps { - sh 'source ~/.bashrc && cd adderservice && sh build.sh deploy' - } - } - } -} - diff --git a/Chapter11/deploying-a-full-system/micro/adderservice/build.sh b/Chapter11/deploying-a-full-system/micro/adderservice/build.sh deleted file mode 100644 index 7da8cb6..0000000 --- a/Chapter11/deploying-a-full-system/micro/adderservice/build.sh +++ /dev/null @@ -1,23 +0,0 @@ -#!/bin/bash -source ~/.bashrc - -GITSHA=$(git rev-parse --short HEAD) - -case "$1" in - container) - sudo -u pelger docker build -t adderservice:$GITSHA . - sudo -u pelger docker tag adderservice:$GITSHA pelger/adderservice:$GITSHA - sudo -i -u pelger docker push pelger/adderservice:$GITSHA - ;; - deploy) - sed -e s/_NAME_/adderservice/ -e s/_PORT_/8080/ < ../deployment/service-template.yml > svc.yml - sed -e s/_NAME_/adderservice/ -e s/_PORT_/8080/ -e s/_IMAGE_/pelger\\/adderservice:$GITSHA/ < ../deployment/deployment-template.yml > dep.yml - sudo -i -u pelger kubectl apply -f $(pwd)/svc.yml - sudo -i -u pelger kubectl apply -f $(pwd)/dep.yml - ;; - *) - echo 'invalid build command' - exit 1 - ;; -esac - diff --git a/Chapter11/deploying-a-full-system/micro/adderservice/index.js b/Chapter11/deploying-a-full-system/micro/adderservice/index.js deleted file mode 100644 index 1f2d9cf..0000000 --- a/Chapter11/deploying-a-full-system/micro/adderservice/index.js +++ /dev/null @@ -1,7 +0,0 @@ -'use strict' - -const wiring = require('./wiring') -const service = require('./service')() - - -wiring(service) diff --git a/Chapter11/deploying-a-full-system/micro/adderservice/package.json b/Chapter11/deploying-a-full-system/micro/adderservice/package.json deleted file mode 100644 index c612751..0000000 --- a/Chapter11/deploying-a-full-system/micro/adderservice/package.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "name": "adder-service", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "test": "echo \"no test specified\" && exit 0" - }, - "keywords": [], - "author": "Peter Elger ", - "license": "ISC", - "dependencies": { - "restify": "^4.3.0" - } -} diff --git a/Chapter11/deploying-a-full-system/micro/adderservice/service.js b/Chapter11/deploying-a-full-system/micro/adderservice/service.js deleted file mode 100644 index 9d0d175..0000000 --- a/Chapter11/deploying-a-full-system/micro/adderservice/service.js +++ /dev/null @@ -1,13 +0,0 @@ -'use strict' - -module.exports = service - -function service () { - function add (args, cb) { - const {first, second} = args - const result = (parseInt(first, 10) + parseInt(second, 10)) - cb(null, {result: result.toString()}) - } - - return { add } -} diff --git a/Chapter11/deploying-a-full-system/micro/adderservice/wiring.js b/Chapter11/deploying-a-full-system/micro/adderservice/wiring.js deleted file mode 100644 index 0ed018c..0000000 --- a/Chapter11/deploying-a-full-system/micro/adderservice/wiring.js +++ /dev/null @@ -1,27 +0,0 @@ -'use strict' - -const restify = require('restify') -const { ADDERSERVICE_SERVICE_PORT } = process.env - -module.exports = wiring - -function wiring (service) { - const server = restify.createServer() - - server.get('/add/:first/:second', (req, res, next) => { - service.add(req.params, (err, result) => { - if (err) { - res.send(err) - next() - return - } - res.send(200, result) - next() - }) - }) - - server.listen(ADDERSERVICE_SERVICE_PORT, '0.0.0.0', () => { - console.log('%s listening at %s', server.name, server.url) - }) -} - diff --git a/Chapter11/deploying-a-full-system/micro/auditservice/.dockerignore b/Chapter11/deploying-a-full-system/micro/auditservice/.dockerignore deleted file mode 100644 index 90718e6..0000000 --- a/Chapter11/deploying-a-full-system/micro/auditservice/.dockerignore +++ /dev/null @@ -1,4 +0,0 @@ -.git -.gitignore -node_modules -npm-debug.log diff --git a/Chapter11/deploying-a-full-system/micro/auditservice/Dockerfile b/Chapter11/deploying-a-full-system/micro/auditservice/Dockerfile deleted file mode 100644 index 4d2e56b..0000000 --- a/Chapter11/deploying-a-full-system/micro/auditservice/Dockerfile +++ /dev/null @@ -1,7 +0,0 @@ -FROM node:slim -RUN mkdir -p /home/node/service -WORKDIR /home/node/service -COPY package.json /home/node/service -RUN npm install -COPY . /home/node/service -CMD [ "node", "index.js" ] diff --git a/Chapter11/deploying-a-full-system/micro/auditservice/Jenkinsfile b/Chapter11/deploying-a-full-system/micro/auditservice/Jenkinsfile deleted file mode 100644 index 6a75d1a..0000000 --- a/Chapter11/deploying-a-full-system/micro/auditservice/Jenkinsfile +++ /dev/null @@ -1,32 +0,0 @@ -pipeline { - agent any - - stages { - stage('Checkout') { - steps { - checkout scm - } - } - stage('Build') { - steps { - sh 'source ~/.bashrc && cd auditservice && npm install' - } - } - stage('Test'){ - steps { - sh 'source ~/.bashrc && cd auditservice && npm test' - } - } - stage('Container'){ - steps { - sh 'source ~/.bashrc && cd auditservice && sh build.sh container' - } - } - stage('Deploy'){ - steps { - sh 'source ~/.bashrc && cd auditservice && sh build.sh deploy' - } - } - } -} - diff --git a/Chapter11/deploying-a-full-system/micro/auditservice/build.sh b/Chapter11/deploying-a-full-system/micro/auditservice/build.sh deleted file mode 100644 index efa553c..0000000 --- a/Chapter11/deploying-a-full-system/micro/auditservice/build.sh +++ /dev/null @@ -1,23 +0,0 @@ -#!/bin/bash -source ~/.bashrc - -GITSHA=$(git rev-parse --short HEAD) - -case "$1" in - container) - sudo -u pelger docker build -t auditservice:$GITSHA . - sudo -u pelger docker tag auditservice:$GITSHA pelger/auditservice:$GITSHA - sudo -i -u pelger docker push pelger/auditservice:$GITSHA - ;; - deploy) - sed -e s/_NAME_/auditservice/ -e s/_PORT_/8081/ < ../deployment/service-template.yml > svc.yml - sed -e s/_NAME_/auditservice/ -e s/_PORT_/8081/ -e s/_IMAGE_/pelger\\/auditservice:$GITSHA/ < ../deployment/deployment-template.yml > dep.yml - sudo -i -u pelger kubectl apply -f $(pwd)/svc.yml - sudo -i -u pelger kubectl apply -f $(pwd)/dep.yml - ;; - *) - echo 'invalid build command' - exit 1 - ;; -esac - diff --git a/Chapter11/deploying-a-full-system/micro/auditservice/index.js b/Chapter11/deploying-a-full-system/micro/auditservice/index.js deleted file mode 100644 index 40a4677..0000000 --- a/Chapter11/deploying-a-full-system/micro/auditservice/index.js +++ /dev/null @@ -1,6 +0,0 @@ -'use strict' - -const wiring = require('./wiring') -const service = require('./service')() - -wiring(service) diff --git a/Chapter11/deploying-a-full-system/micro/auditservice/package.json b/Chapter11/deploying-a-full-system/micro/auditservice/package.json deleted file mode 100644 index bcb0138..0000000 --- a/Chapter11/deploying-a-full-system/micro/auditservice/package.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "name": "auditservice", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "test": "echo \"no test specified\" && exit 0" - }, - "keywords": [], - "author": "Peter Elger ", - "license": "ISC", - "dependencies": { - "concordant": "^0.2.1", - "mongodb": "^2.2.25", - "restify": "^4.3.0" - } -} diff --git a/Chapter11/deploying-a-full-system/micro/auditservice/service.js b/Chapter11/deploying-a-full-system/micro/auditservice/service.js deleted file mode 100644 index c416e4c..0000000 --- a/Chapter11/deploying-a-full-system/micro/auditservice/service.js +++ /dev/null @@ -1,74 +0,0 @@ -'use strict' - -const { MongoClient } = require('mongodb') -const { dns } = require('concordant')() - -module.exports = service - -function service () { - - var db - - setup() - - function setup () { - const mongo = '_main._tcp.mongo.micro.svc.cluster.local' - - dns.resolve(mongo, (err, locs) => { - if (err) { - console.error(err) - return - } - const { host, port } = locs[0] - const url = `mongodb://${host}:${port}/audit` - MongoClient.connect(url, (err, client) => { - if (err) { - console.log('failed to connect to MongoDB retrying in 100ms') - setTimeout(setup, 100) - return - } - db = client - db.on('close', () => db = null) - }) - }) - } - - function append (args, cb) { - if (!db) { - cb(Error('No database connection')) - return - } - const audit = db.collection('audit') - const data = { - ts: Date.now(), - calc: args.calc, - result: args.calcResult - } - - audit.insert(data, (err, result) => { - if (err) { - cb(err) - return - } - cb(null, {result: result.toString()}) - }) - } - - function list (args, cb) { - if (!db) { - cb(Error('No database connection')) - return - } - const audit = db.collection('audit') - audit.find({}, {limit: 10}).toArray((err, docs) => { - if (err) { - cb(err) - return - } - cb(null, {list: docs}) - }) - } - - return { append, list } -} - diff --git a/Chapter11/deploying-a-full-system/micro/auditservice/wiring.js b/Chapter11/deploying-a-full-system/micro/auditservice/wiring.js deleted file mode 100644 index b18dce8..0000000 --- a/Chapter11/deploying-a-full-system/micro/auditservice/wiring.js +++ /dev/null @@ -1,39 +0,0 @@ -'use strict' - -const restify = require('restify') -const { AUDITSERVICE_SERVICE_PORT } = process.env - -module.exports = wiring - -function wiring (service) { - const server = restify.createServer() - - server.use(restify.bodyParser()) - - server.post('/append', (req, res, next) => { - service.append(req.params, (err, result) => { - if (err) { - res.send(err) - return - } - res.send(result) - next() - }) - }) - - server.get('/list', (req, res, next) => { - service.list(req.params, (err, result) => { - if (err) { - res.send(err) - return - } - res.send(200, result) - next() - }) - }) - - server.listen(AUDITSERVICE_SERVICE_PORT, '0.0.0.0', () => { - console.log('%s listening at %s', server.name, server.url) - }) -} - diff --git a/Chapter11/deploying-a-full-system/micro/deployment/deployment-template.yml b/Chapter11/deploying-a-full-system/micro/deployment/deployment-template.yml deleted file mode 100644 index 42ee070..0000000 --- a/Chapter11/deploying-a-full-system/micro/deployment/deployment-template.yml +++ /dev/null @@ -1,17 +0,0 @@ -apiVersion: extensions/v1beta1 -kind: Deployment -metadata: - name: _NAME_ -spec: - replicas: 1 - template: - metadata: - labels: - run: _NAME_ - spec: - containers: - - name: _NAME_ - image: _IMAGE_ - ports: - - containerPort: _PORT_ - diff --git a/Chapter11/deploying-a-full-system/micro/deployment/namespace.yml b/Chapter11/deploying-a-full-system/micro/deployment/namespace.yml deleted file mode 100644 index 1351cbb..0000000 --- a/Chapter11/deploying-a-full-system/micro/deployment/namespace.yml +++ /dev/null @@ -1,6 +0,0 @@ -apiVersion: v1 -kind: Namespace -metadata: - name: micro - labels: - name: micro diff --git a/Chapter11/deploying-a-full-system/micro/deployment/service-template.yml b/Chapter11/deploying-a-full-system/micro/deployment/service-template.yml deleted file mode 100644 index 11010f6..0000000 --- a/Chapter11/deploying-a-full-system/micro/deployment/service-template.yml +++ /dev/null @@ -1,16 +0,0 @@ -apiVersion: v1 -kind: Service -metadata: - name: _NAME_ - labels: - run: _NAME_ -spec: - ports: - - port: _PORT_ - name: main - protocol: TCP - targetPort: _PORT_ - selector: - run: _NAME_ - type: NodePort - diff --git a/Chapter11/deploying-a-full-system/micro/eventservice/.dockerignore b/Chapter11/deploying-a-full-system/micro/eventservice/.dockerignore deleted file mode 100644 index 90718e6..0000000 --- a/Chapter11/deploying-a-full-system/micro/eventservice/.dockerignore +++ /dev/null @@ -1,4 +0,0 @@ -.git -.gitignore -node_modules -npm-debug.log diff --git a/Chapter11/deploying-a-full-system/micro/eventservice/Dockerfile b/Chapter11/deploying-a-full-system/micro/eventservice/Dockerfile deleted file mode 100644 index 4d2e56b..0000000 --- a/Chapter11/deploying-a-full-system/micro/eventservice/Dockerfile +++ /dev/null @@ -1,7 +0,0 @@ -FROM node:slim -RUN mkdir -p /home/node/service -WORKDIR /home/node/service -COPY package.json /home/node/service -RUN npm install -COPY . /home/node/service -CMD [ "node", "index.js" ] diff --git a/Chapter11/deploying-a-full-system/micro/eventservice/Jenkinsfile b/Chapter11/deploying-a-full-system/micro/eventservice/Jenkinsfile deleted file mode 100644 index 81614ce..0000000 --- a/Chapter11/deploying-a-full-system/micro/eventservice/Jenkinsfile +++ /dev/null @@ -1,32 +0,0 @@ -pipeline { - agent any - - stages { - stage('Checkout') { - steps { - checkout scm - } - } - stage('Build') { - steps { - sh 'source ~/.bashrc && cd eventservice && npm install' - } - } - stage('Test'){ - steps { - sh 'source ~/.bashrc && cd eventservice && npm test' - } - } - stage('Container'){ - steps { - sh 'source ~/.bashrc && cd eventservice && sh build.sh container' - } - } - stage('Deploy'){ - steps { - sh 'source ~/.bashrc && cd eventservice && sh build.sh deploy' - } - } - } -} - diff --git a/Chapter11/deploying-a-full-system/micro/eventservice/build.sh b/Chapter11/deploying-a-full-system/micro/eventservice/build.sh deleted file mode 100644 index 68099f0..0000000 --- a/Chapter11/deploying-a-full-system/micro/eventservice/build.sh +++ /dev/null @@ -1,23 +0,0 @@ -#!/bin/bash -source ~/.bashrc - -GITSHA=$(git rev-parse --short HEAD) - -case "$1" in - container) - sudo -u pelger docker build -t eventservice:$GITSHA . - sudo -u pelger docker tag eventservice:$GITSHA pelger/eventservice:$GITSHA - sudo -i -u pelger docker push pelger/eventservice:$GITSHA - ;; - deploy) - sed -e s/_NAME_/eventservice/ -e s/_PORT_/8082/ < ../deployment/service-template.yml > svc.yml - sed -e s/_NAME_/eventservice/ -e s/_PORT_/8082/ -e s/_IMAGE_/pelger\\/eventservice:$GITSHA/ < ../deployment/deployment-template.yml > dep.yml - sudo -i -u pelger kubectl apply -f $(pwd)/svc.yml - sudo -i -u pelger kubectl apply -f $(pwd)/dep.yml - ;; - *) - echo 'invalid build command' - exit 1 - ;; -esac - diff --git a/Chapter11/deploying-a-full-system/micro/eventservice/index.js b/Chapter11/deploying-a-full-system/micro/eventservice/index.js deleted file mode 100644 index df3a380..0000000 --- a/Chapter11/deploying-a-full-system/micro/eventservice/index.js +++ /dev/null @@ -1,5 +0,0 @@ -'use strict' - -const wiring = require('./wiring') -const service = require('./service')() -wiring(service) diff --git a/Chapter11/deploying-a-full-system/micro/eventservice/package.json b/Chapter11/deploying-a-full-system/micro/eventservice/package.json deleted file mode 100644 index baca7cb..0000000 --- a/Chapter11/deploying-a-full-system/micro/eventservice/package.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "name": "event-service", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "test": "echo \"no test specified\" && exit 0" - }, - "keywords": [], - "author": "Peter Elger ", - "license": "ISC", - "dependencies": { - "concordant": "^0.2.1", - "mongodb": "^2.2.25", - "redis": "^2.6.5" - } -} diff --git a/Chapter11/deploying-a-full-system/micro/eventservice/service.js b/Chapter11/deploying-a-full-system/micro/eventservice/service.js deleted file mode 100644 index 4082d3e..0000000 --- a/Chapter11/deploying-a-full-system/micro/eventservice/service.js +++ /dev/null @@ -1,80 +0,0 @@ -'use strict' - -const { MongoClient } = require('mongodb') -const { dns } = require('concordant')() - -module.exports = service - -function service () { - var db - - setup() - - function setup () { - const mongo = '_main._tcp.mongo.micro.svc.cluster.local' - - dns.resolve(mongo, (err, locs) => { - if (err) { - console.error(err) - return - } - const { host, port } = locs[0] - const url = `mongodb://${host}:${port}/events` - MongoClient.connect(url, (err, client) => { - if (err) { - console.log('failed to connect to MongoDB retrying in 100ms') - setTimeout(setup, 100) - return - } - db = client - db.on('close', () => db = null) - }) - }) - } - - function record (args, cb) { - if (!db) { - cb(Error('No database connection')) - return - } - const events = db.collection('events') - const data = { - ts: Date.now(), - eventType: args.type, - url: args.url - } - events.insert(data, (err, result) => { - if (err) { - cb(err) - return - } - cb(null, result) - }) - } - - function summary (args, cb) { - if (!db) { - cb(Error('No database connection')) - return - } - const summary = {} - const events = db.collection('events') - events.find({}).toArray( (err, docs) => { - if (err) return cb(err) - - docs.forEach(function (doc) { - if (!(summary[doc.url])) { - summary[doc.url] = 1 - } else { - summary[doc.url]++ - } - }) - cb(null, summary) - }) - } - - return { - record: record, - summary: summary - } -} diff --git a/Chapter11/deploying-a-full-system/micro/eventservice/wiring.js b/Chapter11/deploying-a-full-system/micro/eventservice/wiring.js deleted file mode 100644 index b04ab35..0000000 --- a/Chapter11/deploying-a-full-system/micro/eventservice/wiring.js +++ /dev/null @@ -1,53 +0,0 @@ -'use strict' - -const { dns } = require('concordant')() -const redis = require('redis') -const QNAME = 'eventservice' - -module.exports = wiring - -function wiring (service) { - - const endpoint = '_main._tcp.redis.micro.svc.cluster.local' - - dns.resolve(endpoint, (err, locs) => { - if (err) { - console.log(err) - return - } - const { port, host } = locs[0] - pullFromQueue(redis.createClient(port, host)) - }) - - function pullFromQueue (client) { - client.brpop(QNAME, 5, function (err, data) { - if (err) console.error(err) - if (err || !data) { - pullFromQueue(client) - return - } - const msg = JSON.parse(data[1]) - const { action, returnPath } = msg - const cmd = service[action] - if (typeof cmd !== 'function') { - pullFromQueue(client) - return - } - cmd(msg, (err, result) => { - if (err) { - console.error(err) - pullFromQueue(client) - return - } - if (!returnPath) { - pullFromQueue(client) - return - } - client.lpush(returnPath, JSON.stringify(result), (err) => { - if (err) console.error(err) - pullFromQueue(client) - }) - }) - }) - } -} diff --git a/Chapter11/deploying-a-full-system/micro/fuge/fuge.yml b/Chapter11/deploying-a-full-system/micro/fuge/fuge.yml deleted file mode 100644 index 839ba34..0000000 --- a/Chapter11/deploying-a-full-system/micro/fuge/fuge.yml +++ /dev/null @@ -1,45 +0,0 @@ -fuge_global: - run_containers: true - dns_enabled: true - dns_host: 127.0.0.1 - dns_port: 53053 - dns_suffix: svc.cluster.local - dns_namespace: micro - tail: true - monitor: true - monitor_excludes: - - '**/node_modules/**' - - '**/.git/**' - - '**/*.log' -adderservice: - type: node - path: ../adderservice - run: node index.js - ports: - - main=8080 -auditservice: - type: process - path: ../auditservice - run: 'node index.js' - ports: - - main=8081 -eventservice: - type: process - path: ../eventservice - run: 'node index.js' -webapp: - type: process - path: ../webapp - run: npm start - ports: - - http=3000 -mongo: - image: mongo - type: container - ports: - - main=27017:27017 -redis: - image: redis - type: container - ports: - - main=6379:6379 diff --git a/Chapter11/deploying-a-full-system/micro/infrastructure/Jenkinsfile b/Chapter11/deploying-a-full-system/micro/infrastructure/Jenkinsfile deleted file mode 100644 index d204b09..0000000 --- a/Chapter11/deploying-a-full-system/micro/infrastructure/Jenkinsfile +++ /dev/null @@ -1,22 +0,0 @@ -pipeline { - agent any - - stages { - stage('Checkout') { - steps { - checkout scm - } - } - stage('DeployMongo'){ - steps { - sh 'source ~/.bashrc && cd infrastructure && sh build.sh mongo' - } - } - stage('DeployRedis'){ - steps { - sh 'source ~/.bashrc && cd infrastructure && sh build.sh redis' - } - } - } -} - diff --git a/Chapter11/deploying-a-full-system/micro/infrastructure/build.sh b/Chapter11/deploying-a-full-system/micro/infrastructure/build.sh deleted file mode 100644 index dc36a20..0000000 --- a/Chapter11/deploying-a-full-system/micro/infrastructure/build.sh +++ /dev/null @@ -1,22 +0,0 @@ -#!/bin/bash -sh source ~/.bashrc - -case "$1" in - mongo) - sed -e s/_NAME_/mongo/ -e s/_PORT_/27017/ < ../deployment/service-template.yml > svc.yml - sed -e s/_NAME_/mongo/ -e s/_PORT_/27017/ -e s/_IMAGE_/mongo/ < ../deployment/deployment-template.yml > dep.yml - sudo -i -u pelger kubectl apply -f $(pwd)/svc.yml - sudo -i -u pelger kubectl apply -f $(pwd)/dep.yml - ;; - redis) - sed -e s/_NAME_/redis/ -e s/_PORT_/6379/ < ../deployment/service-template.yml > svc.yml - sed -e s/_NAME_/redis/ -e s/_PORT_/6379/ -e s/_IMAGE_/redis/ < ../deployment/deployment-template.yml > dep.yml - sudo -i -u pelger kubectl apply -f $(pwd)/svc.yml - sudo -i -u pelger kubectl apply -f $(pwd)/dep.yml - ;; - *) - echo 'invalid build command' - exit 1 - ;; -esac - diff --git a/Chapter11/deploying-a-full-system/micro/report/.dockerignore b/Chapter11/deploying-a-full-system/micro/report/.dockerignore deleted file mode 100644 index 90718e6..0000000 --- a/Chapter11/deploying-a-full-system/micro/report/.dockerignore +++ /dev/null @@ -1,4 +0,0 @@ -.git -.gitignore -node_modules -npm-debug.log diff --git a/Chapter11/deploying-a-full-system/micro/report/Dockerfile b/Chapter11/deploying-a-full-system/micro/report/Dockerfile deleted file mode 100644 index 4d2e56b..0000000 --- a/Chapter11/deploying-a-full-system/micro/report/Dockerfile +++ /dev/null @@ -1,7 +0,0 @@ -FROM node:slim -RUN mkdir -p /home/node/service -WORKDIR /home/node/service -COPY package.json /home/node/service -RUN npm install -COPY . /home/node/service -CMD [ "node", "index.js" ] diff --git a/Chapter11/deploying-a-full-system/micro/report/env.js b/Chapter11/deploying-a-full-system/micro/report/env.js deleted file mode 100644 index a4d26e9..0000000 --- a/Chapter11/deploying-a-full-system/micro/report/env.js +++ /dev/null @@ -1,17 +0,0 @@ -'use strict' - -// provides environment variable setup for concordant - -const env = { - DNS_NAMESPACE: 'micro', - DNS_SUFFIX: 'svc.cluster.local' -} - -if (process.env.NODE_ENV !== 'production') { - Object.assign(env, { - DNS_HOST: '127.0.0.1', - DNS_PORT: '53053' - }) -} - -Object.assign(process.env, env) \ No newline at end of file diff --git a/Chapter11/deploying-a-full-system/micro/report/index.js b/Chapter11/deploying-a-full-system/micro/report/index.js deleted file mode 100644 index b65b65a..0000000 --- a/Chapter11/deploying-a-full-system/micro/report/index.js +++ /dev/null @@ -1,43 +0,0 @@ -'use strict' -require('./env') -const { dns } = require('concordant')() -const redis = require('redis') -const CliTable = require('cli-table') -const QNAME = 'eventservice' -const RESPONSE_QUEUE = 'summary' -const ENDPOINT = '_main._tcp.redis.micro.svc.cluster.local' - -dns.resolve(ENDPOINT, report) - -function report (err, locs) { - if (err) { return console.log(err) } - const { port, host } = locs[0] - const client = redis.createClient(port, host) - const event = JSON.stringify({ - action: 'summary', - returnPath: RESPONSE_QUEUE - }) - - client.lpush(QNAME, event, (err) => { - if (err) { - console.error(err) - return - } - - client.brpop(RESPONSE_QUEUE, 5, (err, data) => { - if (err) { - console.error(err) - return - } - const summary = JSON.parse(data[1]) - const cols = Object.keys(summary).map((url) => [url, summary[url]]) - const table = new CliTable({ - head: ['url', 'count'], - colWidths: [50, 10] - }) - table.push(...cols) - console.log(table.toString()) - client.quit() - }) - }) -} \ No newline at end of file diff --git a/Chapter11/deploying-a-full-system/micro/report/package.json b/Chapter11/deploying-a-full-system/micro/report/package.json deleted file mode 100644 index da2bd04..0000000 --- a/Chapter11/deploying-a-full-system/micro/report/package.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "name": "report", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "test": "echo \"no test specified\" && exit 0" - }, - "keywords": [], - "author": "Peter Elger ", - "license": "ISC", - "dependencies": { - "cli-table": "^0.3.1", - "concordant": "^0.2.1", - "redis": "^2.6.5" - } -} diff --git a/Chapter11/deploying-a-full-system/micro/webapp/.dockerignore b/Chapter11/deploying-a-full-system/micro/webapp/.dockerignore deleted file mode 100644 index 90718e6..0000000 --- a/Chapter11/deploying-a-full-system/micro/webapp/.dockerignore +++ /dev/null @@ -1,4 +0,0 @@ -.git -.gitignore -node_modules -npm-debug.log diff --git a/Chapter11/deploying-a-full-system/micro/webapp/Dockerfile b/Chapter11/deploying-a-full-system/micro/webapp/Dockerfile deleted file mode 100644 index b2ffa24..0000000 --- a/Chapter11/deploying-a-full-system/micro/webapp/Dockerfile +++ /dev/null @@ -1,7 +0,0 @@ -FROM node:slim -RUN mkdir -p /home/node/service -WORKDIR /home/node/service -COPY package.json /home/node/service -RUN npm install -COPY . /home/node/service -CMD [ "npm", "start" ] diff --git a/Chapter11/deploying-a-full-system/micro/webapp/app.js b/Chapter11/deploying-a-full-system/micro/webapp/app.js deleted file mode 100644 index eef315b..0000000 --- a/Chapter11/deploying-a-full-system/micro/webapp/app.js +++ /dev/null @@ -1,52 +0,0 @@ -var express = require('express') -var path = require('path') -var favicon = require('serve-favicon') -var logger = require('morgan') -var cookieParser = require('cookie-parser') -var bodyParser = require('body-parser') -var eventLogger = require('./lib/event-logger') - -var index = require('./routes/index') -var users = require('./routes/users') -var add = require('./routes/add') -var audit = require('./routes/audit') - -var app = express() - -// view engine setup -app.set('views', path.join(__dirname, 'views')) -app.set('view engine', 'ejs') - -// uncomment after placing your favicon in /public -// app.use(favicon(path.join(__dirname, 'public', 'favicon.ico'))); -app.use(eventLogger()) -app.use(logger('dev')) -app.use(bodyParser.json()) -app.use(bodyParser.urlencoded({ extended: false })) -app.use(cookieParser()) -app.use(express.static(path.join(__dirname, 'public'))) - -app.use('/', index) -app.use('/users', users) -app.use('/add', add) -app.use('/audit', audit) - -// catch 404 and forward to error handler -app.use(function (req, res, next) { - var err = new Error('Not Found') - err.status = 404 - next(err) -}) - -// error handler -app.use(function (err, req, res, next) { - // set locals, only providing error in development - res.locals.message = err.message - res.locals.error = req.app.get('env') === 'development' ? err : {} - - // render the error page - res.status(err.status || 500) - res.render('error') -}) - -module.exports = app diff --git a/Chapter11/deploying-a-full-system/micro/webapp/bin/www b/Chapter11/deploying-a-full-system/micro/webapp/bin/www deleted file mode 100644 index 8715eeb..0000000 --- a/Chapter11/deploying-a-full-system/micro/webapp/bin/www +++ /dev/null @@ -1,90 +0,0 @@ -#!/usr/bin/env node - -/** - * Module dependencies. - */ - -var app = require('../app'); -var debug = require('debug')('webapp:server'); -var http = require('http'); - -/** - * Get port from environment and store in Express. - */ - -var port = normalizePort(process.env.PORT || '3000'); -app.set('port', port); - -/** - * Create HTTP server. - */ - -var server = http.createServer(app); - -/** - * Listen on provided port, on all network interfaces. - */ - -server.listen(port); -server.on('error', onError); -server.on('listening', onListening); - -/** - * Normalize a port into a number, string, or false. - */ - -function normalizePort(val) { - var port = parseInt(val, 10); - - if (isNaN(port)) { - // named pipe - return val; - } - - if (port >= 0) { - // port number - return port; - } - - return false; -} - -/** - * Event listener for HTTP server "error" event. - */ - -function onError(error) { - if (error.syscall !== 'listen') { - throw error; - } - - var bind = typeof port === 'string' - ? 'Pipe ' + port - : 'Port ' + port; - - // handle specific listen errors with friendly messages - switch (error.code) { - case 'EACCES': - console.error(bind + ' requires elevated privileges'); - process.exit(1); - break; - case 'EADDRINUSE': - console.error(bind + ' is already in use'); - process.exit(1); - break; - default: - throw error; - } -} - -/** - * Event listener for HTTP server "listening" event. - */ - -function onListening() { - var addr = server.address(); - var bind = typeof addr === 'string' - ? 'pipe ' + addr - : 'port ' + addr.port; - debug('Listening on ' + bind); -} diff --git a/Chapter11/deploying-a-full-system/micro/webapp/lib/event-logger.js b/Chapter11/deploying-a-full-system/micro/webapp/lib/event-logger.js deleted file mode 100644 index 0140d3f..0000000 --- a/Chapter11/deploying-a-full-system/micro/webapp/lib/event-logger.js +++ /dev/null @@ -1,40 +0,0 @@ -'use strict' - -const { dns } = require('concordant')() -const redis = require('redis') - -module.exports = eventLogger - -function eventLogger () { - const QNAME = 'eventservice' - var client - - const endpoint = '_main._tcp.redis.micro.svc.cluster.local' - dns.resolve(endpoint, (err, locs) => { - if (err) { - console.error(err) - return - } - const { port, host } = locs[0] - client = redis.createClient(port, host) - }) - - function middleware (req, res, next) { - if (!client) { - console.log('client not ready, waiting 100ms') - setTimeout(middleware, 100, req, res, next) - return - } - const event = { - action: 'record', - type: 'page', - url: `${req.protocol}://${req.get('host')}${req.originalUrl}` - } - client.lpush(QNAME, JSON.stringify(event), (err) => { - if (err) console.error(err) - next() - }) - } - - return middleware -} diff --git a/Chapter11/deploying-a-full-system/micro/webapp/package.json b/Chapter11/deploying-a-full-system/micro/webapp/package.json deleted file mode 100644 index 1c45acf..0000000 --- a/Chapter11/deploying-a-full-system/micro/webapp/package.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "name": "webapp", - "version": "0.0.0", - "private": true, - "scripts": { - "start": "node ./bin/www" - }, - "dependencies": { - "body-parser": "~1.16.0", - "concordant": "^0.2.1", - "cookie-parser": "~1.4.3", - "debug": "~2.6.0", - "ejs": "~2.5.5", - "express": "~4.14.1", - "morgan": "~1.7.0", - "mu": "^2.1.2", - "restify": "^4.3.0", - "serve-favicon": "~2.3.2" - } -} diff --git a/Chapter11/deploying-a-full-system/micro/webapp/public/stylesheets/style.css b/Chapter11/deploying-a-full-system/micro/webapp/public/stylesheets/style.css deleted file mode 100644 index 9453385..0000000 --- a/Chapter11/deploying-a-full-system/micro/webapp/public/stylesheets/style.css +++ /dev/null @@ -1,8 +0,0 @@ -body { - padding: 50px; - font: 14px "Lucida Grande", Helvetica, Arial, sans-serif; -} - -a { - color: #00B7FF; -} diff --git a/Chapter11/deploying-a-full-system/micro/webapp/routes/add.js b/Chapter11/deploying-a-full-system/micro/webapp/routes/add.js deleted file mode 100644 index 3ab03cc..0000000 --- a/Chapter11/deploying-a-full-system/micro/webapp/routes/add.js +++ /dev/null @@ -1,68 +0,0 @@ -'use strict' - -const { Router } = require('express') -const restify = require('restify') -const { dns } = require('concordant')() -const router = Router() -var clients - -router.get('/', function (req, res) { - res.render('add', { first: 0, second: 0, result: 0 }) -}) - -router.post('/calculate', resolve, respond) - -function resolve (req, res, next) { - if (clients) { - next() - return - } - const adderservice = `_main._tcp.adderservice.micro.svc.cluster.local` - const auditservice = `_main._tcp.auditservice.micro.svc.cluster.local` - dns.resolve(adderservice, (err, locs) => { - if (err) { - next(err) - return - } - const { host, port } = locs[0] - const adder = `${host}:${port}` - dns.resolve(auditservice, (err, locs) => { - if (err) { - next(err) - return - } - const { host, port } = locs[0] - const audit = `${host}:${port}` - clients = { - adder: restify.createJSONClient({url: `http://${adder}`}), - audit: restify.createJSONClient({url: `http://${audit}`}) - } - next() - }) - }) -} - -function respond (req, res, next) { - const { first, second } = req.body - clients.adder.get( - `/add/${first}/${second}`, - (err, svcReq, svcRes, data) => { - if (err) { - next(err) - return - } - - const { result } = data - clients.audit.post('/append', { - calc: first + '+' + second, - calcResult: result - }, (err) => { - if (err) console.error(err) - }) - - res.render('add', { first, second, result }) - } - ) -} - -module.exports = router diff --git a/Chapter11/deploying-a-full-system/micro/webapp/routes/audit.js b/Chapter11/deploying-a-full-system/micro/webapp/routes/audit.js deleted file mode 100644 index a083eef..0000000 --- a/Chapter11/deploying-a-full-system/micro/webapp/routes/audit.js +++ /dev/null @@ -1,37 +0,0 @@ -'use strict' - -const { Router } = require('express') -const restify = require('restify') -const { dns } = require('concordant')() -const router = Router() -var client - -router.get('/', resolve, respond) - -function resolve (req, res, next) { - if (client) { - next() - return - } - const auditservice = `_main._tcp.auditservice.micro.svc.cluster.local` - dns.resolve(auditservice, (err, locs) => { - if (err) { - next(err) - return - } - const { host, port } = locs[0] - client = restify.createJSONClient(`http://${host}:${port}`) - }) -} - -function respond (req, res, next) { - client.get('/list', (err, svcReq, svcRes, data) => { - if (err) { - next(err) - return - } - res.render('audit', data) - }) -} - -module.exports = router diff --git a/Chapter11/deploying-a-full-system/micro/webapp/routes/index.js b/Chapter11/deploying-a-full-system/micro/webapp/routes/index.js deleted file mode 100644 index 956680b..0000000 --- a/Chapter11/deploying-a-full-system/micro/webapp/routes/index.js +++ /dev/null @@ -1,9 +0,0 @@ -var express = require('express') -var router = express.Router() - -/* GET home page. */ -router.get('/', function (req, res, next) { - res.render('index', { title: 'Express' }) -}) - -module.exports = router diff --git a/Chapter11/deploying-a-full-system/micro/webapp/routes/users.js b/Chapter11/deploying-a-full-system/micro/webapp/routes/users.js deleted file mode 100644 index 8cfe88f..0000000 --- a/Chapter11/deploying-a-full-system/micro/webapp/routes/users.js +++ /dev/null @@ -1,9 +0,0 @@ -var express = require('express') -var router = express.Router() - -/* GET users listing. */ -router.get('/', function (req, res, next) { - res.send('respond with a resource') -}) - -module.exports = router diff --git a/Chapter11/deploying-a-full-system/micro/webapp/views/add.ejs b/Chapter11/deploying-a-full-system/micro/webapp/views/add.ejs deleted file mode 100644 index da8279c..0000000 --- a/Chapter11/deploying-a-full-system/micro/webapp/views/add.ejs +++ /dev/null @@ -1,16 +0,0 @@ - - - - Add - - - -

Add it up!

-
- > - > -
- -

result = <%= result %>

- - diff --git a/Chapter11/deploying-a-full-system/micro/webapp/views/audit.ejs b/Chapter11/deploying-a-full-system/micro/webapp/views/audit.ejs deleted file mode 100644 index dd6d71b..0000000 --- a/Chapter11/deploying-a-full-system/micro/webapp/views/audit.ejs +++ /dev/null @@ -1,15 +0,0 @@ - - - - Audit - - - -

Calculation History

-
    - <% list.forEach(function (el) { %> -
  • at: <%= new Date(el.ts).toLocaleString() %>, calculated: <%= el.calc %>, result: <%= el.result %>
  • - <% }) %> -
- - \ No newline at end of file diff --git a/Chapter11/deploying-a-full-system/micro/webapp/views/error.ejs b/Chapter11/deploying-a-full-system/micro/webapp/views/error.ejs deleted file mode 100644 index 7cf94ed..0000000 --- a/Chapter11/deploying-a-full-system/micro/webapp/views/error.ejs +++ /dev/null @@ -1,3 +0,0 @@ -

<%= message %>

-

<%= error.status %>

-
<%= error.stack %>
diff --git a/Chapter11/deploying-a-full-system/micro/webapp/views/index.ejs b/Chapter11/deploying-a-full-system/micro/webapp/views/index.ejs deleted file mode 100644 index 7b7a1d6..0000000 --- a/Chapter11/deploying-a-full-system/micro/webapp/views/index.ejs +++ /dev/null @@ -1,11 +0,0 @@ - - - - <%= title %> - - - -

<%= title %>

-

Welcome to <%= title %>

- - diff --git a/Chapter11/deploying-to-the-cloud/micro/adderservice/.dockerignore b/Chapter11/deploying-to-the-cloud/micro/adderservice/.dockerignore deleted file mode 100644 index 90718e6..0000000 --- a/Chapter11/deploying-to-the-cloud/micro/adderservice/.dockerignore +++ /dev/null @@ -1,4 +0,0 @@ -.git -.gitignore -node_modules -npm-debug.log diff --git a/Chapter11/deploying-to-the-cloud/micro/adderservice/Dockerfile b/Chapter11/deploying-to-the-cloud/micro/adderservice/Dockerfile deleted file mode 100644 index 4d2e56b..0000000 --- a/Chapter11/deploying-to-the-cloud/micro/adderservice/Dockerfile +++ /dev/null @@ -1,7 +0,0 @@ -FROM node:slim -RUN mkdir -p /home/node/service -WORKDIR /home/node/service -COPY package.json /home/node/service -RUN npm install -COPY . /home/node/service -CMD [ "node", "index.js" ] diff --git a/Chapter11/deploying-to-the-cloud/micro/adderservice/Jenkinsfile b/Chapter11/deploying-to-the-cloud/micro/adderservice/Jenkinsfile deleted file mode 100644 index 8ea826e..0000000 --- a/Chapter11/deploying-to-the-cloud/micro/adderservice/Jenkinsfile +++ /dev/null @@ -1,32 +0,0 @@ -pipeline { - agent any - - stages { - stage('Checkout') { - steps { - checkout scm - } - } - stage('Build') { - steps { - sh 'source ~/.bashrc && cd adderservice && npm install' - } - } - stage('Test'){ - steps { - sh 'source ~/.bashrc && cd adderservice && npm test' - } - } - stage('Container'){ - steps { - sh 'source ~/.bashrc && cd adderservice && sh build.sh container' - } - } - stage('Deploy'){ - steps { - sh 'source ~/.bashrc && cd adderservice && sh build.sh deploy' - } - } - } -} - diff --git a/Chapter11/deploying-to-the-cloud/micro/adderservice/build.sh b/Chapter11/deploying-to-the-cloud/micro/adderservice/build.sh deleted file mode 100644 index 7da8cb6..0000000 --- a/Chapter11/deploying-to-the-cloud/micro/adderservice/build.sh +++ /dev/null @@ -1,23 +0,0 @@ -#!/bin/bash -source ~/.bashrc - -GITSHA=$(git rev-parse --short HEAD) - -case "$1" in - container) - sudo -u pelger docker build -t adderservice:$GITSHA . - sudo -u pelger docker tag adderservice:$GITSHA pelger/adderservice:$GITSHA - sudo -i -u pelger docker push pelger/adderservice:$GITSHA - ;; - deploy) - sed -e s/_NAME_/adderservice/ -e s/_PORT_/8080/ < ../deployment/service-template.yml > svc.yml - sed -e s/_NAME_/adderservice/ -e s/_PORT_/8080/ -e s/_IMAGE_/pelger\\/adderservice:$GITSHA/ < ../deployment/deployment-template.yml > dep.yml - sudo -i -u pelger kubectl apply -f $(pwd)/svc.yml - sudo -i -u pelger kubectl apply -f $(pwd)/dep.yml - ;; - *) - echo 'invalid build command' - exit 1 - ;; -esac - diff --git a/Chapter11/deploying-to-the-cloud/micro/adderservice/index.js b/Chapter11/deploying-to-the-cloud/micro/adderservice/index.js deleted file mode 100644 index 1f2d9cf..0000000 --- a/Chapter11/deploying-to-the-cloud/micro/adderservice/index.js +++ /dev/null @@ -1,7 +0,0 @@ -'use strict' - -const wiring = require('./wiring') -const service = require('./service')() - - -wiring(service) diff --git a/Chapter11/deploying-to-the-cloud/micro/adderservice/package.json b/Chapter11/deploying-to-the-cloud/micro/adderservice/package.json deleted file mode 100644 index c612751..0000000 --- a/Chapter11/deploying-to-the-cloud/micro/adderservice/package.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "name": "adder-service", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "test": "echo \"no test specified\" && exit 0" - }, - "keywords": [], - "author": "Peter Elger ", - "license": "ISC", - "dependencies": { - "restify": "^4.3.0" - } -} diff --git a/Chapter11/deploying-to-the-cloud/micro/adderservice/service.js b/Chapter11/deploying-to-the-cloud/micro/adderservice/service.js deleted file mode 100644 index 9d0d175..0000000 --- a/Chapter11/deploying-to-the-cloud/micro/adderservice/service.js +++ /dev/null @@ -1,13 +0,0 @@ -'use strict' - -module.exports = service - -function service () { - function add (args, cb) { - const {first, second} = args - const result = (parseInt(first, 10) + parseInt(second, 10)) - cb(null, {result: result.toString()}) - } - - return { add } -} diff --git a/Chapter11/deploying-to-the-cloud/micro/adderservice/wiring.js b/Chapter11/deploying-to-the-cloud/micro/adderservice/wiring.js deleted file mode 100644 index 0ed018c..0000000 --- a/Chapter11/deploying-to-the-cloud/micro/adderservice/wiring.js +++ /dev/null @@ -1,27 +0,0 @@ -'use strict' - -const restify = require('restify') -const { ADDERSERVICE_SERVICE_PORT } = process.env - -module.exports = wiring - -function wiring (service) { - const server = restify.createServer() - - server.get('/add/:first/:second', (req, res, next) => { - service.add(req.params, (err, result) => { - if (err) { - res.send(err) - next() - return - } - res.send(200, result) - next() - }) - }) - - server.listen(ADDERSERVICE_SERVICE_PORT, '0.0.0.0', () => { - console.log('%s listening at %s', server.name, server.url) - }) -} - diff --git a/Chapter11/deploying-to-the-cloud/micro/auditservice/.dockerignore b/Chapter11/deploying-to-the-cloud/micro/auditservice/.dockerignore deleted file mode 100644 index 90718e6..0000000 --- a/Chapter11/deploying-to-the-cloud/micro/auditservice/.dockerignore +++ /dev/null @@ -1,4 +0,0 @@ -.git -.gitignore -node_modules -npm-debug.log diff --git a/Chapter11/deploying-to-the-cloud/micro/auditservice/Dockerfile b/Chapter11/deploying-to-the-cloud/micro/auditservice/Dockerfile deleted file mode 100644 index 4d2e56b..0000000 --- a/Chapter11/deploying-to-the-cloud/micro/auditservice/Dockerfile +++ /dev/null @@ -1,7 +0,0 @@ -FROM node:slim -RUN mkdir -p /home/node/service -WORKDIR /home/node/service -COPY package.json /home/node/service -RUN npm install -COPY . /home/node/service -CMD [ "node", "index.js" ] diff --git a/Chapter11/deploying-to-the-cloud/micro/auditservice/Jenkinsfile b/Chapter11/deploying-to-the-cloud/micro/auditservice/Jenkinsfile deleted file mode 100644 index 6a75d1a..0000000 --- a/Chapter11/deploying-to-the-cloud/micro/auditservice/Jenkinsfile +++ /dev/null @@ -1,32 +0,0 @@ -pipeline { - agent any - - stages { - stage('Checkout') { - steps { - checkout scm - } - } - stage('Build') { - steps { - sh 'source ~/.bashrc && cd auditservice && npm install' - } - } - stage('Test'){ - steps { - sh 'source ~/.bashrc && cd auditservice && npm test' - } - } - stage('Container'){ - steps { - sh 'source ~/.bashrc && cd auditservice && sh build.sh container' - } - } - stage('Deploy'){ - steps { - sh 'source ~/.bashrc && cd auditservice && sh build.sh deploy' - } - } - } -} - diff --git a/Chapter11/deploying-to-the-cloud/micro/auditservice/build.sh b/Chapter11/deploying-to-the-cloud/micro/auditservice/build.sh deleted file mode 100644 index efa553c..0000000 --- a/Chapter11/deploying-to-the-cloud/micro/auditservice/build.sh +++ /dev/null @@ -1,23 +0,0 @@ -#!/bin/bash -source ~/.bashrc - -GITSHA=$(git rev-parse --short HEAD) - -case "$1" in - container) - sudo -u pelger docker build -t auditservice:$GITSHA . - sudo -u pelger docker tag auditservice:$GITSHA pelger/auditservice:$GITSHA - sudo -i -u pelger docker push pelger/auditservice:$GITSHA - ;; - deploy) - sed -e s/_NAME_/auditservice/ -e s/_PORT_/8081/ < ../deployment/service-template.yml > svc.yml - sed -e s/_NAME_/auditservice/ -e s/_PORT_/8081/ -e s/_IMAGE_/pelger\\/auditservice:$GITSHA/ < ../deployment/deployment-template.yml > dep.yml - sudo -i -u pelger kubectl apply -f $(pwd)/svc.yml - sudo -i -u pelger kubectl apply -f $(pwd)/dep.yml - ;; - *) - echo 'invalid build command' - exit 1 - ;; -esac - diff --git a/Chapter11/deploying-to-the-cloud/micro/auditservice/index.js b/Chapter11/deploying-to-the-cloud/micro/auditservice/index.js deleted file mode 100644 index 40a4677..0000000 --- a/Chapter11/deploying-to-the-cloud/micro/auditservice/index.js +++ /dev/null @@ -1,6 +0,0 @@ -'use strict' - -const wiring = require('./wiring') -const service = require('./service')() - -wiring(service) diff --git a/Chapter11/deploying-to-the-cloud/micro/auditservice/package.json b/Chapter11/deploying-to-the-cloud/micro/auditservice/package.json deleted file mode 100644 index bcb0138..0000000 --- a/Chapter11/deploying-to-the-cloud/micro/auditservice/package.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "name": "auditservice", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "test": "echo \"no test specified\" && exit 0" - }, - "keywords": [], - "author": "Peter Elger ", - "license": "ISC", - "dependencies": { - "concordant": "^0.2.1", - "mongodb": "^2.2.25", - "restify": "^4.3.0" - } -} diff --git a/Chapter11/deploying-to-the-cloud/micro/auditservice/service.js b/Chapter11/deploying-to-the-cloud/micro/auditservice/service.js deleted file mode 100644 index c416e4c..0000000 --- a/Chapter11/deploying-to-the-cloud/micro/auditservice/service.js +++ /dev/null @@ -1,74 +0,0 @@ -'use strict' - -const { MongoClient } = require('mongodb') -const { dns } = require('concordant')() - -module.exports = service - -function service () { - - var db - - setup() - - function setup () { - const mongo = '_main._tcp.mongo.micro.svc.cluster.local' - - dns.resolve(mongo, (err, locs) => { - if (err) { - console.error(err) - return - } - const { host, port } = locs[0] - const url = `mongodb://${host}:${port}/audit` - MongoClient.connect(url, (err, client) => { - if (err) { - console.log('failed to connect to MongoDB retrying in 100ms') - setTimeout(setup, 100) - return - } - db = client - db.on('close', () => db = null) - }) - }) - } - - function append (args, cb) { - if (!db) { - cb(Error('No database connection')) - return - } - const audit = db.collection('audit') - const data = { - ts: Date.now(), - calc: args.calc, - result: args.calcResult - } - - audit.insert(data, (err, result) => { - if (err) { - cb(err) - return - } - cb(null, {result: result.toString()}) - }) - } - - function list (args, cb) { - if (!db) { - cb(Error('No database connection')) - return - } - const audit = db.collection('audit') - audit.find({}, {limit: 10}).toArray((err, docs) => { - if (err) { - cb(err) - return - } - cb(null, {list: docs}) - }) - } - - return { append, list } -} - diff --git a/Chapter11/deploying-to-the-cloud/micro/auditservice/wiring.js b/Chapter11/deploying-to-the-cloud/micro/auditservice/wiring.js deleted file mode 100644 index b18dce8..0000000 --- a/Chapter11/deploying-to-the-cloud/micro/auditservice/wiring.js +++ /dev/null @@ -1,39 +0,0 @@ -'use strict' - -const restify = require('restify') -const { AUDITSERVICE_SERVICE_PORT } = process.env - -module.exports = wiring - -function wiring (service) { - const server = restify.createServer() - - server.use(restify.bodyParser()) - - server.post('/append', (req, res, next) => { - service.append(req.params, (err, result) => { - if (err) { - res.send(err) - return - } - res.send(result) - next() - }) - }) - - server.get('/list', (req, res, next) => { - service.list(req.params, (err, result) => { - if (err) { - res.send(err) - return - } - res.send(200, result) - next() - }) - }) - - server.listen(AUDITSERVICE_SERVICE_PORT, '0.0.0.0', () => { - console.log('%s listening at %s', server.name, server.url) - }) -} - diff --git a/Chapter11/deploying-to-the-cloud/micro/deployment/deployment-template.yml b/Chapter11/deploying-to-the-cloud/micro/deployment/deployment-template.yml deleted file mode 100644 index 42ee070..0000000 --- a/Chapter11/deploying-to-the-cloud/micro/deployment/deployment-template.yml +++ /dev/null @@ -1,17 +0,0 @@ -apiVersion: extensions/v1beta1 -kind: Deployment -metadata: - name: _NAME_ -spec: - replicas: 1 - template: - metadata: - labels: - run: _NAME_ - spec: - containers: - - name: _NAME_ - image: _IMAGE_ - ports: - - containerPort: _PORT_ - diff --git a/Chapter11/deploying-to-the-cloud/micro/deployment/namespace.yml b/Chapter11/deploying-to-the-cloud/micro/deployment/namespace.yml deleted file mode 100644 index 1351cbb..0000000 --- a/Chapter11/deploying-to-the-cloud/micro/deployment/namespace.yml +++ /dev/null @@ -1,6 +0,0 @@ -apiVersion: v1 -kind: Namespace -metadata: - name: micro - labels: - name: micro diff --git a/Chapter11/deploying-to-the-cloud/micro/deployment/service-template-lb.yml b/Chapter11/deploying-to-the-cloud/micro/deployment/service-template-lb.yml deleted file mode 100644 index 0f6a1b6..0000000 --- a/Chapter11/deploying-to-the-cloud/micro/deployment/service-template-lb.yml +++ /dev/null @@ -1,16 +0,0 @@ -apiVersion: v1 -kind: Service -metadata: - name: _NAME_ - labels: - run: _NAME_ -spec: - ports: - - port: _PORT_ - name: main - protocol: TCP - targetPort: _PORT_ - selector: - run: _NAME_ - type: LoadBalancer - diff --git a/Chapter11/deploying-to-the-cloud/micro/deployment/service-template.yml b/Chapter11/deploying-to-the-cloud/micro/deployment/service-template.yml deleted file mode 100644 index 11010f6..0000000 --- a/Chapter11/deploying-to-the-cloud/micro/deployment/service-template.yml +++ /dev/null @@ -1,16 +0,0 @@ -apiVersion: v1 -kind: Service -metadata: - name: _NAME_ - labels: - run: _NAME_ -spec: - ports: - - port: _PORT_ - name: main - protocol: TCP - targetPort: _PORT_ - selector: - run: _NAME_ - type: NodePort - diff --git a/Chapter11/deploying-to-the-cloud/micro/eventservice/.dockerignore b/Chapter11/deploying-to-the-cloud/micro/eventservice/.dockerignore deleted file mode 100644 index 90718e6..0000000 --- a/Chapter11/deploying-to-the-cloud/micro/eventservice/.dockerignore +++ /dev/null @@ -1,4 +0,0 @@ -.git -.gitignore -node_modules -npm-debug.log diff --git a/Chapter11/deploying-to-the-cloud/micro/eventservice/Dockerfile b/Chapter11/deploying-to-the-cloud/micro/eventservice/Dockerfile deleted file mode 100644 index 4d2e56b..0000000 --- a/Chapter11/deploying-to-the-cloud/micro/eventservice/Dockerfile +++ /dev/null @@ -1,7 +0,0 @@ -FROM node:slim -RUN mkdir -p /home/node/service -WORKDIR /home/node/service -COPY package.json /home/node/service -RUN npm install -COPY . /home/node/service -CMD [ "node", "index.js" ] diff --git a/Chapter11/deploying-to-the-cloud/micro/eventservice/Jenkinsfile b/Chapter11/deploying-to-the-cloud/micro/eventservice/Jenkinsfile deleted file mode 100644 index 81614ce..0000000 --- a/Chapter11/deploying-to-the-cloud/micro/eventservice/Jenkinsfile +++ /dev/null @@ -1,32 +0,0 @@ -pipeline { - agent any - - stages { - stage('Checkout') { - steps { - checkout scm - } - } - stage('Build') { - steps { - sh 'source ~/.bashrc && cd eventservice && npm install' - } - } - stage('Test'){ - steps { - sh 'source ~/.bashrc && cd eventservice && npm test' - } - } - stage('Container'){ - steps { - sh 'source ~/.bashrc && cd eventservice && sh build.sh container' - } - } - stage('Deploy'){ - steps { - sh 'source ~/.bashrc && cd eventservice && sh build.sh deploy' - } - } - } -} - diff --git a/Chapter11/deploying-to-the-cloud/micro/eventservice/build.sh b/Chapter11/deploying-to-the-cloud/micro/eventservice/build.sh deleted file mode 100644 index 68099f0..0000000 --- a/Chapter11/deploying-to-the-cloud/micro/eventservice/build.sh +++ /dev/null @@ -1,23 +0,0 @@ -#!/bin/bash -source ~/.bashrc - -GITSHA=$(git rev-parse --short HEAD) - -case "$1" in - container) - sudo -u pelger docker build -t eventservice:$GITSHA . - sudo -u pelger docker tag eventservice:$GITSHA pelger/eventservice:$GITSHA - sudo -i -u pelger docker push pelger/eventservice:$GITSHA - ;; - deploy) - sed -e s/_NAME_/eventservice/ -e s/_PORT_/8082/ < ../deployment/service-template.yml > svc.yml - sed -e s/_NAME_/eventservice/ -e s/_PORT_/8082/ -e s/_IMAGE_/pelger\\/eventservice:$GITSHA/ < ../deployment/deployment-template.yml > dep.yml - sudo -i -u pelger kubectl apply -f $(pwd)/svc.yml - sudo -i -u pelger kubectl apply -f $(pwd)/dep.yml - ;; - *) - echo 'invalid build command' - exit 1 - ;; -esac - diff --git a/Chapter11/deploying-to-the-cloud/micro/eventservice/index.js b/Chapter11/deploying-to-the-cloud/micro/eventservice/index.js deleted file mode 100644 index df3a380..0000000 --- a/Chapter11/deploying-to-the-cloud/micro/eventservice/index.js +++ /dev/null @@ -1,5 +0,0 @@ -'use strict' - -const wiring = require('./wiring') -const service = require('./service')() -wiring(service) diff --git a/Chapter11/deploying-to-the-cloud/micro/eventservice/package.json b/Chapter11/deploying-to-the-cloud/micro/eventservice/package.json deleted file mode 100644 index baca7cb..0000000 --- a/Chapter11/deploying-to-the-cloud/micro/eventservice/package.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "name": "event-service", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "test": "echo \"no test specified\" && exit 0" - }, - "keywords": [], - "author": "Peter Elger ", - "license": "ISC", - "dependencies": { - "concordant": "^0.2.1", - "mongodb": "^2.2.25", - "redis": "^2.6.5" - } -} diff --git a/Chapter11/deploying-to-the-cloud/micro/eventservice/service.js b/Chapter11/deploying-to-the-cloud/micro/eventservice/service.js deleted file mode 100644 index 4082d3e..0000000 --- a/Chapter11/deploying-to-the-cloud/micro/eventservice/service.js +++ /dev/null @@ -1,80 +0,0 @@ -'use strict' - -const { MongoClient } = require('mongodb') -const { dns } = require('concordant')() - -module.exports = service - -function service () { - var db - - setup() - - function setup () { - const mongo = '_main._tcp.mongo.micro.svc.cluster.local' - - dns.resolve(mongo, (err, locs) => { - if (err) { - console.error(err) - return - } - const { host, port } = locs[0] - const url = `mongodb://${host}:${port}/events` - MongoClient.connect(url, (err, client) => { - if (err) { - console.log('failed to connect to MongoDB retrying in 100ms') - setTimeout(setup, 100) - return - } - db = client - db.on('close', () => db = null) - }) - }) - } - - function record (args, cb) { - if (!db) { - cb(Error('No database connection')) - return - } - const events = db.collection('events') - const data = { - ts: Date.now(), - eventType: args.type, - url: args.url - } - events.insert(data, (err, result) => { - if (err) { - cb(err) - return - } - cb(null, result) - }) - } - - function summary (args, cb) { - if (!db) { - cb(Error('No database connection')) - return - } - const summary = {} - const events = db.collection('events') - events.find({}).toArray( (err, docs) => { - if (err) return cb(err) - - docs.forEach(function (doc) { - if (!(summary[doc.url])) { - summary[doc.url] = 1 - } else { - summary[doc.url]++ - } - }) - cb(null, summary) - }) - } - - return { - record: record, - summary: summary - } -} diff --git a/Chapter11/deploying-to-the-cloud/micro/eventservice/wiring.js b/Chapter11/deploying-to-the-cloud/micro/eventservice/wiring.js deleted file mode 100644 index b04ab35..0000000 --- a/Chapter11/deploying-to-the-cloud/micro/eventservice/wiring.js +++ /dev/null @@ -1,53 +0,0 @@ -'use strict' - -const { dns } = require('concordant')() -const redis = require('redis') -const QNAME = 'eventservice' - -module.exports = wiring - -function wiring (service) { - - const endpoint = '_main._tcp.redis.micro.svc.cluster.local' - - dns.resolve(endpoint, (err, locs) => { - if (err) { - console.log(err) - return - } - const { port, host } = locs[0] - pullFromQueue(redis.createClient(port, host)) - }) - - function pullFromQueue (client) { - client.brpop(QNAME, 5, function (err, data) { - if (err) console.error(err) - if (err || !data) { - pullFromQueue(client) - return - } - const msg = JSON.parse(data[1]) - const { action, returnPath } = msg - const cmd = service[action] - if (typeof cmd !== 'function') { - pullFromQueue(client) - return - } - cmd(msg, (err, result) => { - if (err) { - console.error(err) - pullFromQueue(client) - return - } - if (!returnPath) { - pullFromQueue(client) - return - } - client.lpush(returnPath, JSON.stringify(result), (err) => { - if (err) console.error(err) - pullFromQueue(client) - }) - }) - }) - } -} diff --git a/Chapter11/deploying-to-the-cloud/micro/fuge/fuge.yml b/Chapter11/deploying-to-the-cloud/micro/fuge/fuge.yml deleted file mode 100644 index 839ba34..0000000 --- a/Chapter11/deploying-to-the-cloud/micro/fuge/fuge.yml +++ /dev/null @@ -1,45 +0,0 @@ -fuge_global: - run_containers: true - dns_enabled: true - dns_host: 127.0.0.1 - dns_port: 53053 - dns_suffix: svc.cluster.local - dns_namespace: micro - tail: true - monitor: true - monitor_excludes: - - '**/node_modules/**' - - '**/.git/**' - - '**/*.log' -adderservice: - type: node - path: ../adderservice - run: node index.js - ports: - - main=8080 -auditservice: - type: process - path: ../auditservice - run: 'node index.js' - ports: - - main=8081 -eventservice: - type: process - path: ../eventservice - run: 'node index.js' -webapp: - type: process - path: ../webapp - run: npm start - ports: - - http=3000 -mongo: - image: mongo - type: container - ports: - - main=27017:27017 -redis: - image: redis - type: container - ports: - - main=6379:6379 diff --git a/Chapter11/deploying-to-the-cloud/micro/infrastructure/Jenkinsfile b/Chapter11/deploying-to-the-cloud/micro/infrastructure/Jenkinsfile deleted file mode 100644 index d204b09..0000000 --- a/Chapter11/deploying-to-the-cloud/micro/infrastructure/Jenkinsfile +++ /dev/null @@ -1,22 +0,0 @@ -pipeline { - agent any - - stages { - stage('Checkout') { - steps { - checkout scm - } - } - stage('DeployMongo'){ - steps { - sh 'source ~/.bashrc && cd infrastructure && sh build.sh mongo' - } - } - stage('DeployRedis'){ - steps { - sh 'source ~/.bashrc && cd infrastructure && sh build.sh redis' - } - } - } -} - diff --git a/Chapter11/deploying-to-the-cloud/micro/infrastructure/build.sh b/Chapter11/deploying-to-the-cloud/micro/infrastructure/build.sh deleted file mode 100644 index dc36a20..0000000 --- a/Chapter11/deploying-to-the-cloud/micro/infrastructure/build.sh +++ /dev/null @@ -1,22 +0,0 @@ -#!/bin/bash -sh source ~/.bashrc - -case "$1" in - mongo) - sed -e s/_NAME_/mongo/ -e s/_PORT_/27017/ < ../deployment/service-template.yml > svc.yml - sed -e s/_NAME_/mongo/ -e s/_PORT_/27017/ -e s/_IMAGE_/mongo/ < ../deployment/deployment-template.yml > dep.yml - sudo -i -u pelger kubectl apply -f $(pwd)/svc.yml - sudo -i -u pelger kubectl apply -f $(pwd)/dep.yml - ;; - redis) - sed -e s/_NAME_/redis/ -e s/_PORT_/6379/ < ../deployment/service-template.yml > svc.yml - sed -e s/_NAME_/redis/ -e s/_PORT_/6379/ -e s/_IMAGE_/redis/ < ../deployment/deployment-template.yml > dep.yml - sudo -i -u pelger kubectl apply -f $(pwd)/svc.yml - sudo -i -u pelger kubectl apply -f $(pwd)/dep.yml - ;; - *) - echo 'invalid build command' - exit 1 - ;; -esac - diff --git a/Chapter11/deploying-to-the-cloud/micro/report/.dockerignore b/Chapter11/deploying-to-the-cloud/micro/report/.dockerignore deleted file mode 100644 index 90718e6..0000000 --- a/Chapter11/deploying-to-the-cloud/micro/report/.dockerignore +++ /dev/null @@ -1,4 +0,0 @@ -.git -.gitignore -node_modules -npm-debug.log diff --git a/Chapter11/deploying-to-the-cloud/micro/report/Dockerfile b/Chapter11/deploying-to-the-cloud/micro/report/Dockerfile deleted file mode 100644 index 4d2e56b..0000000 --- a/Chapter11/deploying-to-the-cloud/micro/report/Dockerfile +++ /dev/null @@ -1,7 +0,0 @@ -FROM node:slim -RUN mkdir -p /home/node/service -WORKDIR /home/node/service -COPY package.json /home/node/service -RUN npm install -COPY . /home/node/service -CMD [ "node", "index.js" ] diff --git a/Chapter11/deploying-to-the-cloud/micro/report/env.js b/Chapter11/deploying-to-the-cloud/micro/report/env.js deleted file mode 100644 index a4d26e9..0000000 --- a/Chapter11/deploying-to-the-cloud/micro/report/env.js +++ /dev/null @@ -1,17 +0,0 @@ -'use strict' - -// provides environment variable setup for concordant - -const env = { - DNS_NAMESPACE: 'micro', - DNS_SUFFIX: 'svc.cluster.local' -} - -if (process.env.NODE_ENV !== 'production') { - Object.assign(env, { - DNS_HOST: '127.0.0.1', - DNS_PORT: '53053' - }) -} - -Object.assign(process.env, env) \ No newline at end of file diff --git a/Chapter11/deploying-to-the-cloud/micro/report/index.js b/Chapter11/deploying-to-the-cloud/micro/report/index.js deleted file mode 100644 index b65b65a..0000000 --- a/Chapter11/deploying-to-the-cloud/micro/report/index.js +++ /dev/null @@ -1,43 +0,0 @@ -'use strict' -require('./env') -const { dns } = require('concordant')() -const redis = require('redis') -const CliTable = require('cli-table') -const QNAME = 'eventservice' -const RESPONSE_QUEUE = 'summary' -const ENDPOINT = '_main._tcp.redis.micro.svc.cluster.local' - -dns.resolve(ENDPOINT, report) - -function report (err, locs) { - if (err) { return console.log(err) } - const { port, host } = locs[0] - const client = redis.createClient(port, host) - const event = JSON.stringify({ - action: 'summary', - returnPath: RESPONSE_QUEUE - }) - - client.lpush(QNAME, event, (err) => { - if (err) { - console.error(err) - return - } - - client.brpop(RESPONSE_QUEUE, 5, (err, data) => { - if (err) { - console.error(err) - return - } - const summary = JSON.parse(data[1]) - const cols = Object.keys(summary).map((url) => [url, summary[url]]) - const table = new CliTable({ - head: ['url', 'count'], - colWidths: [50, 10] - }) - table.push(...cols) - console.log(table.toString()) - client.quit() - }) - }) -} \ No newline at end of file diff --git a/Chapter11/deploying-to-the-cloud/micro/report/package.json b/Chapter11/deploying-to-the-cloud/micro/report/package.json deleted file mode 100644 index da2bd04..0000000 --- a/Chapter11/deploying-to-the-cloud/micro/report/package.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "name": "report", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "test": "echo \"no test specified\" && exit 0" - }, - "keywords": [], - "author": "Peter Elger ", - "license": "ISC", - "dependencies": { - "cli-table": "^0.3.1", - "concordant": "^0.2.1", - "redis": "^2.6.5" - } -} diff --git a/Chapter11/deploying-to-the-cloud/micro/webapp/.dockerignore b/Chapter11/deploying-to-the-cloud/micro/webapp/.dockerignore deleted file mode 100644 index 90718e6..0000000 --- a/Chapter11/deploying-to-the-cloud/micro/webapp/.dockerignore +++ /dev/null @@ -1,4 +0,0 @@ -.git -.gitignore -node_modules -npm-debug.log diff --git a/Chapter11/deploying-to-the-cloud/micro/webapp/Dockerfile b/Chapter11/deploying-to-the-cloud/micro/webapp/Dockerfile deleted file mode 100644 index b2ffa24..0000000 --- a/Chapter11/deploying-to-the-cloud/micro/webapp/Dockerfile +++ /dev/null @@ -1,7 +0,0 @@ -FROM node:slim -RUN mkdir -p /home/node/service -WORKDIR /home/node/service -COPY package.json /home/node/service -RUN npm install -COPY . /home/node/service -CMD [ "npm", "start" ] diff --git a/Chapter11/deploying-to-the-cloud/micro/webapp/app.js b/Chapter11/deploying-to-the-cloud/micro/webapp/app.js deleted file mode 100644 index eef315b..0000000 --- a/Chapter11/deploying-to-the-cloud/micro/webapp/app.js +++ /dev/null @@ -1,52 +0,0 @@ -var express = require('express') -var path = require('path') -var favicon = require('serve-favicon') -var logger = require('morgan') -var cookieParser = require('cookie-parser') -var bodyParser = require('body-parser') -var eventLogger = require('./lib/event-logger') - -var index = require('./routes/index') -var users = require('./routes/users') -var add = require('./routes/add') -var audit = require('./routes/audit') - -var app = express() - -// view engine setup -app.set('views', path.join(__dirname, 'views')) -app.set('view engine', 'ejs') - -// uncomment after placing your favicon in /public -// app.use(favicon(path.join(__dirname, 'public', 'favicon.ico'))); -app.use(eventLogger()) -app.use(logger('dev')) -app.use(bodyParser.json()) -app.use(bodyParser.urlencoded({ extended: false })) -app.use(cookieParser()) -app.use(express.static(path.join(__dirname, 'public'))) - -app.use('/', index) -app.use('/users', users) -app.use('/add', add) -app.use('/audit', audit) - -// catch 404 and forward to error handler -app.use(function (req, res, next) { - var err = new Error('Not Found') - err.status = 404 - next(err) -}) - -// error handler -app.use(function (err, req, res, next) { - // set locals, only providing error in development - res.locals.message = err.message - res.locals.error = req.app.get('env') === 'development' ? err : {} - - // render the error page - res.status(err.status || 500) - res.render('error') -}) - -module.exports = app diff --git a/Chapter11/deploying-to-the-cloud/micro/webapp/bin/www b/Chapter11/deploying-to-the-cloud/micro/webapp/bin/www deleted file mode 100644 index 8715eeb..0000000 --- a/Chapter11/deploying-to-the-cloud/micro/webapp/bin/www +++ /dev/null @@ -1,90 +0,0 @@ -#!/usr/bin/env node - -/** - * Module dependencies. - */ - -var app = require('../app'); -var debug = require('debug')('webapp:server'); -var http = require('http'); - -/** - * Get port from environment and store in Express. - */ - -var port = normalizePort(process.env.PORT || '3000'); -app.set('port', port); - -/** - * Create HTTP server. - */ - -var server = http.createServer(app); - -/** - * Listen on provided port, on all network interfaces. - */ - -server.listen(port); -server.on('error', onError); -server.on('listening', onListening); - -/** - * Normalize a port into a number, string, or false. - */ - -function normalizePort(val) { - var port = parseInt(val, 10); - - if (isNaN(port)) { - // named pipe - return val; - } - - if (port >= 0) { - // port number - return port; - } - - return false; -} - -/** - * Event listener for HTTP server "error" event. - */ - -function onError(error) { - if (error.syscall !== 'listen') { - throw error; - } - - var bind = typeof port === 'string' - ? 'Pipe ' + port - : 'Port ' + port; - - // handle specific listen errors with friendly messages - switch (error.code) { - case 'EACCES': - console.error(bind + ' requires elevated privileges'); - process.exit(1); - break; - case 'EADDRINUSE': - console.error(bind + ' is already in use'); - process.exit(1); - break; - default: - throw error; - } -} - -/** - * Event listener for HTTP server "listening" event. - */ - -function onListening() { - var addr = server.address(); - var bind = typeof addr === 'string' - ? 'pipe ' + addr - : 'port ' + addr.port; - debug('Listening on ' + bind); -} diff --git a/Chapter11/deploying-to-the-cloud/micro/webapp/lib/event-logger.js b/Chapter11/deploying-to-the-cloud/micro/webapp/lib/event-logger.js deleted file mode 100644 index 0140d3f..0000000 --- a/Chapter11/deploying-to-the-cloud/micro/webapp/lib/event-logger.js +++ /dev/null @@ -1,40 +0,0 @@ -'use strict' - -const { dns } = require('concordant')() -const redis = require('redis') - -module.exports = eventLogger - -function eventLogger () { - const QNAME = 'eventservice' - var client - - const endpoint = '_main._tcp.redis.micro.svc.cluster.local' - dns.resolve(endpoint, (err, locs) => { - if (err) { - console.error(err) - return - } - const { port, host } = locs[0] - client = redis.createClient(port, host) - }) - - function middleware (req, res, next) { - if (!client) { - console.log('client not ready, waiting 100ms') - setTimeout(middleware, 100, req, res, next) - return - } - const event = { - action: 'record', - type: 'page', - url: `${req.protocol}://${req.get('host')}${req.originalUrl}` - } - client.lpush(QNAME, JSON.stringify(event), (err) => { - if (err) console.error(err) - next() - }) - } - - return middleware -} diff --git a/Chapter11/deploying-to-the-cloud/micro/webapp/package.json b/Chapter11/deploying-to-the-cloud/micro/webapp/package.json deleted file mode 100644 index 1c45acf..0000000 --- a/Chapter11/deploying-to-the-cloud/micro/webapp/package.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "name": "webapp", - "version": "0.0.0", - "private": true, - "scripts": { - "start": "node ./bin/www" - }, - "dependencies": { - "body-parser": "~1.16.0", - "concordant": "^0.2.1", - "cookie-parser": "~1.4.3", - "debug": "~2.6.0", - "ejs": "~2.5.5", - "express": "~4.14.1", - "morgan": "~1.7.0", - "mu": "^2.1.2", - "restify": "^4.3.0", - "serve-favicon": "~2.3.2" - } -} diff --git a/Chapter11/deploying-to-the-cloud/micro/webapp/public/stylesheets/style.css b/Chapter11/deploying-to-the-cloud/micro/webapp/public/stylesheets/style.css deleted file mode 100644 index 9453385..0000000 --- a/Chapter11/deploying-to-the-cloud/micro/webapp/public/stylesheets/style.css +++ /dev/null @@ -1,8 +0,0 @@ -body { - padding: 50px; - font: 14px "Lucida Grande", Helvetica, Arial, sans-serif; -} - -a { - color: #00B7FF; -} diff --git a/Chapter11/deploying-to-the-cloud/micro/webapp/routes/add.js b/Chapter11/deploying-to-the-cloud/micro/webapp/routes/add.js deleted file mode 100644 index 3ab03cc..0000000 --- a/Chapter11/deploying-to-the-cloud/micro/webapp/routes/add.js +++ /dev/null @@ -1,68 +0,0 @@ -'use strict' - -const { Router } = require('express') -const restify = require('restify') -const { dns } = require('concordant')() -const router = Router() -var clients - -router.get('/', function (req, res) { - res.render('add', { first: 0, second: 0, result: 0 }) -}) - -router.post('/calculate', resolve, respond) - -function resolve (req, res, next) { - if (clients) { - next() - return - } - const adderservice = `_main._tcp.adderservice.micro.svc.cluster.local` - const auditservice = `_main._tcp.auditservice.micro.svc.cluster.local` - dns.resolve(adderservice, (err, locs) => { - if (err) { - next(err) - return - } - const { host, port } = locs[0] - const adder = `${host}:${port}` - dns.resolve(auditservice, (err, locs) => { - if (err) { - next(err) - return - } - const { host, port } = locs[0] - const audit = `${host}:${port}` - clients = { - adder: restify.createJSONClient({url: `http://${adder}`}), - audit: restify.createJSONClient({url: `http://${audit}`}) - } - next() - }) - }) -} - -function respond (req, res, next) { - const { first, second } = req.body - clients.adder.get( - `/add/${first}/${second}`, - (err, svcReq, svcRes, data) => { - if (err) { - next(err) - return - } - - const { result } = data - clients.audit.post('/append', { - calc: first + '+' + second, - calcResult: result - }, (err) => { - if (err) console.error(err) - }) - - res.render('add', { first, second, result }) - } - ) -} - -module.exports = router diff --git a/Chapter11/deploying-to-the-cloud/micro/webapp/routes/audit.js b/Chapter11/deploying-to-the-cloud/micro/webapp/routes/audit.js deleted file mode 100644 index a083eef..0000000 --- a/Chapter11/deploying-to-the-cloud/micro/webapp/routes/audit.js +++ /dev/null @@ -1,37 +0,0 @@ -'use strict' - -const { Router } = require('express') -const restify = require('restify') -const { dns } = require('concordant')() -const router = Router() -var client - -router.get('/', resolve, respond) - -function resolve (req, res, next) { - if (client) { - next() - return - } - const auditservice = `_main._tcp.auditservice.micro.svc.cluster.local` - dns.resolve(auditservice, (err, locs) => { - if (err) { - next(err) - return - } - const { host, port } = locs[0] - client = restify.createJSONClient(`http://${host}:${port}`) - }) -} - -function respond (req, res, next) { - client.get('/list', (err, svcReq, svcRes, data) => { - if (err) { - next(err) - return - } - res.render('audit', data) - }) -} - -module.exports = router diff --git a/Chapter11/deploying-to-the-cloud/micro/webapp/routes/index.js b/Chapter11/deploying-to-the-cloud/micro/webapp/routes/index.js deleted file mode 100644 index 956680b..0000000 --- a/Chapter11/deploying-to-the-cloud/micro/webapp/routes/index.js +++ /dev/null @@ -1,9 +0,0 @@ -var express = require('express') -var router = express.Router() - -/* GET home page. */ -router.get('/', function (req, res, next) { - res.render('index', { title: 'Express' }) -}) - -module.exports = router diff --git a/Chapter11/deploying-to-the-cloud/micro/webapp/routes/users.js b/Chapter11/deploying-to-the-cloud/micro/webapp/routes/users.js deleted file mode 100644 index 8cfe88f..0000000 --- a/Chapter11/deploying-to-the-cloud/micro/webapp/routes/users.js +++ /dev/null @@ -1,9 +0,0 @@ -var express = require('express') -var router = express.Router() - -/* GET users listing. */ -router.get('/', function (req, res, next) { - res.send('respond with a resource') -}) - -module.exports = router diff --git a/Chapter11/deploying-to-the-cloud/micro/webapp/views/add.ejs b/Chapter11/deploying-to-the-cloud/micro/webapp/views/add.ejs deleted file mode 100644 index da8279c..0000000 --- a/Chapter11/deploying-to-the-cloud/micro/webapp/views/add.ejs +++ /dev/null @@ -1,16 +0,0 @@ - - - - Add - - - -

Add it up!

-
- > - > -
- -

result = <%= result %>

- - diff --git a/Chapter11/deploying-to-the-cloud/micro/webapp/views/audit.ejs b/Chapter11/deploying-to-the-cloud/micro/webapp/views/audit.ejs deleted file mode 100644 index dd6d71b..0000000 --- a/Chapter11/deploying-to-the-cloud/micro/webapp/views/audit.ejs +++ /dev/null @@ -1,15 +0,0 @@ - - - - Audit - - - -

Calculation History

-
    - <% list.forEach(function (el) { %> -
  • at: <%= new Date(el.ts).toLocaleString() %>, calculated: <%= el.calc %>, result: <%= el.result %>
  • - <% }) %> -
- - \ No newline at end of file diff --git a/Chapter11/deploying-to-the-cloud/micro/webapp/views/error.ejs b/Chapter11/deploying-to-the-cloud/micro/webapp/views/error.ejs deleted file mode 100644 index 7cf94ed..0000000 --- a/Chapter11/deploying-to-the-cloud/micro/webapp/views/error.ejs +++ /dev/null @@ -1,3 +0,0 @@ -

<%= message %>

-

<%= error.status %>

-
<%= error.stack %>
diff --git a/Chapter11/deploying-to-the-cloud/micro/webapp/views/index.ejs b/Chapter11/deploying-to-the-cloud/micro/webapp/views/index.ejs deleted file mode 100644 index 7b7a1d6..0000000 --- a/Chapter11/deploying-to-the-cloud/micro/webapp/views/index.ejs +++ /dev/null @@ -1,11 +0,0 @@ - - - - <%= title %> - - - -

<%= title %>

-

Welcome to <%= title %>

- - diff --git a/Chapter11/running-a-docker-registry/micro/adderservice/.dockerignore b/Chapter11/running-a-docker-registry/micro/adderservice/.dockerignore deleted file mode 100644 index 90718e6..0000000 --- a/Chapter11/running-a-docker-registry/micro/adderservice/.dockerignore +++ /dev/null @@ -1,4 +0,0 @@ -.git -.gitignore -node_modules -npm-debug.log diff --git a/Chapter11/running-a-docker-registry/micro/adderservice/Dockerfile b/Chapter11/running-a-docker-registry/micro/adderservice/Dockerfile deleted file mode 100644 index 4d2e56b..0000000 --- a/Chapter11/running-a-docker-registry/micro/adderservice/Dockerfile +++ /dev/null @@ -1,7 +0,0 @@ -FROM node:slim -RUN mkdir -p /home/node/service -WORKDIR /home/node/service -COPY package.json /home/node/service -RUN npm install -COPY . /home/node/service -CMD [ "node", "index.js" ] diff --git a/Chapter11/running-a-docker-registry/micro/adderservice/index.js b/Chapter11/running-a-docker-registry/micro/adderservice/index.js deleted file mode 100644 index 753a4ce..0000000 --- a/Chapter11/running-a-docker-registry/micro/adderservice/index.js +++ /dev/null @@ -1,6 +0,0 @@ -'use strict' - -const wiring = require('./wiring') -const service = require('./service')() - -wiring(service) \ No newline at end of file diff --git a/Chapter11/running-a-docker-registry/micro/adderservice/package.json b/Chapter11/running-a-docker-registry/micro/adderservice/package.json deleted file mode 100644 index 595a5b0..0000000 --- a/Chapter11/running-a-docker-registry/micro/adderservice/package.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "name": "adder-service", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" - }, - "keywords": [], - "author": "Peter Elger ", - "license": "ISC", - "dependencies": { - "restify": "^4.3.0" - } -} diff --git a/Chapter11/running-a-docker-registry/micro/adderservice/service.js b/Chapter11/running-a-docker-registry/micro/adderservice/service.js deleted file mode 100644 index af95084..0000000 --- a/Chapter11/running-a-docker-registry/micro/adderservice/service.js +++ /dev/null @@ -1,13 +0,0 @@ -'use strict' - -module.exports = service - -function service () { - function add (args, cb) { - const {first, second} = args - const result = (parseInt(first, 10) + parseInt(second, 10)) - cb(null, {result: result.toString()}) - } - - return { add } -} \ No newline at end of file diff --git a/Chapter11/running-a-docker-registry/micro/adderservice/wiring.js b/Chapter11/running-a-docker-registry/micro/adderservice/wiring.js deleted file mode 100644 index 0e81c6c..0000000 --- a/Chapter11/running-a-docker-registry/micro/adderservice/wiring.js +++ /dev/null @@ -1,26 +0,0 @@ -'use strict' - -const restify = require('restify') -const { ADDERSERVICE_SERVICE_PORT } = process.env - -module.exports = wiring - -function wiring (service) { - const server = restify.createServer() - - server.get('/add/:first/:second', (req, res, next) => { - service.add(req.params, (err, result) => { - if (err) { - res.send(err) - next() - return - } - res.send(200, result) - next() - }) - }) - - server.listen(ADDERSERVICE_SERVICE_PORT, '0.0.0.0', () => { - console.log('%s listening at %s', server.name, server.url) - }) -} \ No newline at end of file diff --git a/Chapter11/running-a-docker-registry/micro/certs/localhost.crt b/Chapter11/running-a-docker-registry/micro/certs/localhost.crt deleted file mode 100644 index ba20df3..0000000 --- a/Chapter11/running-a-docker-registry/micro/certs/localhost.crt +++ /dev/null @@ -1,34 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIF9DCCA9ygAwIBAgIJANNfvhUTrvvCMA0GCSqGSIb3DQEBCwUAMFkxCzAJBgNV -BAYTAkFVMRMwEQYDVQQIEwpTb21lLVN0YXRlMSEwHwYDVQQKExhJbnRlcm5ldCBX -aWRnaXRzIFB0eSBMdGQxEjAQBgNVBAMTCWxvY2FsaG9zdDAeFw0xNzA0MjQxNTEx -MDJaFw0xODA0MjQxNTExMDJaMFkxCzAJBgNVBAYTAkFVMRMwEQYDVQQIEwpTb21l -LVN0YXRlMSEwHwYDVQQKExhJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQxEjAQBgNV -BAMTCWxvY2FsaG9zdDCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMAG -+IOL0sVf1S/4YZ9bzMgIb+n9Z4f5EZQ+6Cs43ohmFpnNcHPw5GsW8I4rKNBmA+Lh -Bgix9HwjWi7ZagbCYErw3avFRA9xSd8MUelLuIzSfhKZVSsMeDNiE1z9PtdkTASz -i2bSgxx4iH1uGH0WDwC84vzMiIX3gNGsbThGVcjG7IFuS4QdeUA2n8zLcPG6lRLB -gPXD6v21bVKBo7FS7UthLWsa1dhvUKk/dpMaVMXINCS90TkyXxIjTkfy8epwD+Vr -98CLboooqt1ETwSdNii0QtP+6fkZ5dhjMfOLmuJ70bEGeK95CjW2ajRDwooNbp0j -dzdPfYGj2tuYQfKf+EJLanTE1W3ohUCAwYpmD8xZ+tsNKxcvCFy8iypBMRiyKKLr -swVaaO3qaM/suGSeTtKGBj2HKPU2IlTvjHfa/sogJyyHdhye0Wy1xQijsDzgL9x3 -+PfoprlQ6mhGCTi4q+oJnmqVq6A6xdvo6L/pYbh/6C5GcdUoILAjL3q4bFxt+PEP -AX+ZYpiZy9q3qRizZuysVMBcNbyNOH9uGXpX13QBjL39rQmIel3ieAmwB4LWsM+x -6+JmPtA/UJ4WyImbUQMW9PM0KQdEkv569VBg6jo0hwjuMaliPCbZZIqBqXpTzAyr -ctMSu6HMmYmicmsThqlHk/C027YqEnRZJao4jz9pAgMBAAGjgb4wgbswHQYDVR0O -BBYEFGHzPwViRuKw8MgGm+HhTnox0k/aMIGLBgNVHSMEgYMwgYCAFGHzPwViRuKw -8MgGm+HhTnox0k/aoV2kWzBZMQswCQYDVQQGEwJBVTETMBEGA1UECBMKU29tZS1T -dGF0ZTEhMB8GA1UEChMYSW50ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMRIwEAYDVQQD -Ewlsb2NhbGhvc3SCCQDTX74VE677wjAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEB -CwUAA4ICAQBPdvbD/IQGPiW4GOxux+tmF83ZDNI/mA4WaNcEsn/edm89TYowktkZ -6f7uMak4CBp0M+1wVGmi0iuM+GrQNysnVbo918+W3OPV1ukons1U6DyzT/0ObsiG -3Iicos64xK5u95AdTvH1Hk0nyGN6Q+O9Pp/clRNA3ulESCjFMOr6pTSjxBZbb1CP -87waZrIB/NVOxFQKPkqJd8e8Q4tiG5e5/ZmhuoYlcU82tTH7dqYFhwQMCvLkZjbv -c9vBcImfS0Qz7nTgh3ZzZIsAyo1BOj24SxRwM/8sCf051VWIJnd0ds4LploeL6dK -QntMK5hVHFLwdfx5glbOSFr1bLGuFQufZSI36bIpkYPd7clmVSwt/tD3C+YEhPBq -7s/DZj8fyvNFxg2tBH6Lw0Z8QM+UVC8eQNUbaVuVDmw3M5/4szDt98hrniUBW4zF -Ep7J3ERSSB7KRwlj623KaF+9EhWKFQTazcVxtSF7a2UmTMuXpIlWgATbYPsXP5fE -wivMvYjXiJrdUuJoAXaGMU+Eo7yT5oEZgRr4LeoOjaCDeWCpoMPxsZ3JnNWqodCN -ZQxGEewNrt/fHdEaEIO79R24t1so4be3vi/1fUU/l4ewdw0ImQvC6IZAFrCUlOsL -rvwPu37M6Mgj4VZ6tcfNWgPUGuhpK9TFIF4R2l0heeHsOs/tpxb3bw== ------END CERTIFICATE----- diff --git a/Chapter11/running-a-docker-registry/micro/certs/localhost.key b/Chapter11/running-a-docker-registry/micro/certs/localhost.key deleted file mode 100644 index 1415238..0000000 --- a/Chapter11/running-a-docker-registry/micro/certs/localhost.key +++ /dev/null @@ -1,51 +0,0 @@ ------BEGIN RSA PRIVATE KEY----- -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 ------END RSA PRIVATE KEY----- diff --git a/Chapter11/storing-images-on-dockerhub/micro/adderservice/.dockerignore b/Chapter11/storing-images-on-dockerhub/micro/adderservice/.dockerignore deleted file mode 100644 index 90718e6..0000000 --- a/Chapter11/storing-images-on-dockerhub/micro/adderservice/.dockerignore +++ /dev/null @@ -1,4 +0,0 @@ -.git -.gitignore -node_modules -npm-debug.log diff --git a/Chapter11/storing-images-on-dockerhub/micro/adderservice/Dockerfile b/Chapter11/storing-images-on-dockerhub/micro/adderservice/Dockerfile deleted file mode 100644 index 4d2e56b..0000000 --- a/Chapter11/storing-images-on-dockerhub/micro/adderservice/Dockerfile +++ /dev/null @@ -1,7 +0,0 @@ -FROM node:slim -RUN mkdir -p /home/node/service -WORKDIR /home/node/service -COPY package.json /home/node/service -RUN npm install -COPY . /home/node/service -CMD [ "node", "index.js" ] diff --git a/Chapter11/storing-images-on-dockerhub/micro/adderservice/index.js b/Chapter11/storing-images-on-dockerhub/micro/adderservice/index.js deleted file mode 100644 index 753a4ce..0000000 --- a/Chapter11/storing-images-on-dockerhub/micro/adderservice/index.js +++ /dev/null @@ -1,6 +0,0 @@ -'use strict' - -const wiring = require('./wiring') -const service = require('./service')() - -wiring(service) \ No newline at end of file diff --git a/Chapter11/storing-images-on-dockerhub/micro/adderservice/package.json b/Chapter11/storing-images-on-dockerhub/micro/adderservice/package.json deleted file mode 100644 index 595a5b0..0000000 --- a/Chapter11/storing-images-on-dockerhub/micro/adderservice/package.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "name": "adder-service", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" - }, - "keywords": [], - "author": "Peter Elger ", - "license": "ISC", - "dependencies": { - "restify": "^4.3.0" - } -} diff --git a/Chapter11/storing-images-on-dockerhub/micro/adderservice/service.js b/Chapter11/storing-images-on-dockerhub/micro/adderservice/service.js deleted file mode 100644 index af95084..0000000 --- a/Chapter11/storing-images-on-dockerhub/micro/adderservice/service.js +++ /dev/null @@ -1,13 +0,0 @@ -'use strict' - -module.exports = service - -function service () { - function add (args, cb) { - const {first, second} = args - const result = (parseInt(first, 10) + parseInt(second, 10)) - cb(null, {result: result.toString()}) - } - - return { add } -} \ No newline at end of file diff --git a/Chapter11/storing-images-on-dockerhub/micro/adderservice/wiring.js b/Chapter11/storing-images-on-dockerhub/micro/adderservice/wiring.js deleted file mode 100644 index 0e81c6c..0000000 --- a/Chapter11/storing-images-on-dockerhub/micro/adderservice/wiring.js +++ /dev/null @@ -1,26 +0,0 @@ -'use strict' - -const restify = require('restify') -const { ADDERSERVICE_SERVICE_PORT } = process.env - -module.exports = wiring - -function wiring (service) { - const server = restify.createServer() - - server.get('/add/:first/:second', (req, res, next) => { - service.add(req.params, (err, result) => { - if (err) { - res.send(err) - next() - return - } - res.send(200, result) - next() - }) - }) - - server.listen(ADDERSERVICE_SERVICE_PORT, '0.0.0.0', () => { - console.log('%s listening at %s', server.name, server.url) - }) -} \ No newline at end of file diff --git a/Chapter11/storing-images-on-dockerhub/test.sh b/Chapter11/storing-images-on-dockerhub/test.sh deleted file mode 100644 index 5086478..0000000 --- a/Chapter11/storing-images-on-dockerhub/test.sh +++ /dev/null @@ -1 +0,0 @@ -curl http://localhost:8080/add/2/3